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

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

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值