您的位置:首页 > 其它

含有指针成员的对象的内存的开辟和释放需要注意的问题

2017-03-01 19:01 375 查看
最近在遇到一个问题,在一个类定义中,有三个的类成员是CxImage的图像指针,存储图像数据,因为每次读取图像的时候都需要开辟一个CxImage对象的内存,我在类的构造函数中为每个CxImage指针new了一个CxImage的内存,在构造函数中进行了释放。但是这样遇到一个问题,有时候,当这个类中的图像指针指向其他的图像时,或者是在调用图像读取函数(函数中开辟了内存返回了一个CxImage对象指针),这个时候就会存在内存泄漏,同时在析构函数中内存的释放也出现了问题。内存泄漏也许短时间内看不出来,但是长时间运行有时候会出问题。

解决办法:

1、在类的构造函数中,只是将指针置位NULL,不要为指针开辟内存,当需要使用的时候再开辟内存。这样避免了,在构造函数中开辟了内存,当指针指向其他数据时,造成内存泄漏的情况。eg:

Class Wnd
{
//....
CxImage* pImg;
//.....
}
Wnd::Wnd()
{
pImg = NULL;
}


2、在类的析构函数中,先判断指针成员是不是NULL,如果不是NULL,则释放其内存,不要直接delete释放。避免了内存释放出错。

Wnd::~Wnd()
{
if (pImg!=NULL)
{
delete pImg;
pImg = NULL;
}
}


3、每次在需要该指针成员的时候,先是将判断该指针成员是不是NULL,如果不是,则先释放内存,同时置为NULL,再为其开辟一个内存;如果是,直接开辟内存即可。这样避免了内存的泄漏。

void main()
{
//....
Wnd wnd0;
//...
//...
if(wnd0.pImg!=NULL)
{
delete wnd0.pImg;
wnd0.pImg = NULL;
}
wnd0.pImg = new CxImage;

//....
}
总结:这样的做法可以最大程度上降低内存泄漏和内存错误释放的可能性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: