近期写了一段代码,发现有内存泄漏,经多次查找都找不到源点,搞到焦头烂额,最后经同事细心审查,竞是粗心导致的隐藏性错误,为了在以后避免犯同样的错误,有必有记录下来。
在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];
}
}
或当申请空间大小已知时,直接在构造函数中申请空间,在析构函数中释放。