Chinaunix首页 | 论坛 | 博客
  • 博客访问: 349264
  • 博文数量: 63
  • 博客积分: 1412
  • 博客等级: 中尉
  • 技术积分: 648
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-10 23:07
文章分类

全部博文(63)

文章存档

2012年(42)

2011年(21)

我的朋友

分类: C/C++

2012-08-13 14:34:06

 怎样预防内存泄漏
分类: C/C++ 353人阅读 评论(0) 收藏 举报

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 m_Momery;

Momery.SetCapacity(nLength);

int *m_pMomery = Momery.GetBuffer();

在CBuffer对象的生存期到了的时候,析构函数会自动delete申请的空间。防止了内存泄漏的发生~而你不需要做任何事~~

优点:

1.不必担心由于忘记释放,或者其他错误导致的内存泄漏

2.统一管理的概念,不仅可以用于内存管理,还可以用于文件句柄,网络端口,线程等一切资源的管理。

3.养成高质量编程的习惯。 

阅读(3221) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~