关于C++内存泄漏的一个经验教训

       近期写了一段代码,发现有内存泄漏,经多次查找都找不到源点,搞到焦头烂额,最后经同事细心审查,竞是粗心导致的隐藏性错误,为了在以后避免犯同样的错误,有必有记录下来。

       在C++中内存管理是很重要的,特别是在new 出内存后,一定要用到相应的delete释放内存,否则就会出现内存泄漏。其实,一般写代码都会有这种意识,但有时自以为是的操作,却不经意引起内存泄漏。

      具体情况大体是如下:

在一个类中

H:

     class A

   {

private:

int* m_pArrData;

public:

A();

~A():

void Function();

   }


cpp:

A::A()

{

m_pArrData=NULL;

}

A::~A()

{

delete []m_pArrData;

}

void A::Function()

{

m_pArrData=new int[100];

}

本以为成员变量m_pArrData在类析构函数中释放内存就行了,但实际上这样做是存在内存泄漏风险的,这取决于Function()函数调用次用,如果只调用一次,m_pArrData只分配一次内存,当然在对象析构时可以正确释放内存。但是,当Function()函数要被多次调用,每次调用都用申请内存,然而m_pArrData只能指向最后一次申请的内存地址,对象析构后只会释放最后一次new出来的内存,这样之前申请的内存不但没有释放,而且也没有指引,不能被释放,一直被占用,直到电脑重启才会释放,这样会告成严重的内存泄漏。

所以,当用到要new内存的指针成员变量时,在成员函数中new内存时一定要注意。如上Funtion()函数,可以这样修改:

void A::Function()

{

if(NULL!=m_pArrData)

        {

m_pArrData=new [100];

        }

}


或当申请空间大小已知时,直接在构造函数中申请空间,在析构函数中释放。


    

猜你喜欢

转载自blog.csdn.net/jeke122966/article/details/25096875