首页 > 学院 > 开发设计 > 正文

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

2019-11-06 08:37:31
字体:
来源:转载
供稿:网友

最近在遇到一个问题,在一个类定义中,有三个的类成员是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;	//....}总结:这样的做法可以最大程度上降低内存泄漏和内存错误释放的可能性。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表