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

3/3/2017来源:C/C++教程人气:1418

最近在遇到一个问题,在一个类定义中,有三个的类成员是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;

	//....
}总结:这样的做法可以最大程度上降低内存泄漏和内存错误释放的可能性。