分类: C/C++
2012-08-13 14:34:06
RAII Resource Acquisition Is Initialization 资源获得即初始化
用我的话来说就是让你象使用栈内存般放心的使用堆内存,而不用担心忘记释放的一种机制。能够让你轻松解决C/C++程序员最头痛的内存泄漏问题
我们先来看看一个错误例子。
Void fun()
{
int *p = new int[nLength];
………. //如果含有if() return,或者抛出异常即会导致内存泄漏.
delete [] p;
}
这是大家很容易会犯的一个错误,而这种泄露由于不稳定性往往是最难被发现的。那么怎么采用RAII来预防内存泄漏的问题呢?
建立一个CBuffer模版
模版:
template
class CBuffer
{
private:
OBJ* m_pBuffer; //资源指针
UINT m_nCapacity; //资源大小
public:
CBuffer();
~CBuffer(); //自动释放资源,调用Reset();
OBJ* GetBuffer(); //获取资源指针
void SetCapacity(UINT nCapacity); //分配资源 (new)
void Reset(); //释放资源 (delete)
};
使用:
CBuffer
Momery.SetCapacity(nLength);
int *m_pMomery = Momery.GetBuffer();
在CBuffer对象的生存期到了的时候,析构函数会自动delete申请的空间。防止了内存泄漏的发生~而你不需要做任何事~~
优点:
1.不必担心由于忘记释放,或者其他错误导致的内存泄漏
2.统一管理的概念,不仅可以用于内存管理,还可以用于文件句柄,网络端口,线程等一切资源的管理。
3.养成高质量编程的习惯。