内存泄露问题

运行一个视频处理的程序时,程序突然异常停止,返回Can't allocate memory !我看了一下进程管理器,大概程序用了1.9G内存,物理内存97%。

下面是一个图像去雾的程序,主函数简略如下,看一下下面的代码有何问题。

int  main()
{
	CvCapture* capture=cvCaptureFromFile("result.avi");
	IplImage *pFrame;
	if(!capture)
		return -1;
	int h=540;
	int w=960;
	int winsize = 2 * max(h,w) / 50 + 1;
	fast_dehaze fdh;
	fdh.init(h,w,winsize);


	for(;;)
	{
		if(!cvGrabFrame(capture))
			break;
		pFrame=cvRetrieveFrame(capture);

		if(!pFrame)
			break;

		
		fdh.doDehaze(pFrame);

		cvShowImage("result",fdh.get_result_image());

		if(cvWaitKey(10)>=0)
			break;
	}

	cvReleaseCapture(&capture);

	cvDestroyWindow("result");   
	return 0;
}

大致说一下一些fast_dahaze是一个去雾类,负责图像处理,保存等。程序看起来很简单,主循环里面做的工作就是获取一帧图像,处理,显示。哪里内存泄露了?

一开始我是以为pFrame是不是应该在循环里释放掉,结果我做了,这样会导致程序异常(因为pFrame是一个指针,指向capture里面的一帧图像数据,不应该把它释放)。


内存泄露的原因是这样的,一开始我自作聪明把fast_dehaze写在大循环for外边,这样在循环外fdh就在循环外边就已经构造完成,并初始化分配一些资源。这样就不用在for循环里面一次次构造,初始化,能提升不少程序运行效率呢!

fast_dehaze fdh;
fdh.init(h,w,winsize);

这样的优化手段不可取,将fdh放在循环外,fdh的作用域就是到了main的结束。这样它其实就一直生存着,没有被释放。

fdh.doDehaze(pFrame);

每次做图像去雾这个操作时候它都会再次分配空间,也就导致内存耗尽了。

正确做法是应该把fast_dehaze对象放在for循环里面,它的作用域就只是循环里面,在循环结束时候自动调用析构函数,释放它占有的资源。

改正后的写法:

int  main()
{
	CvCapture* capture=cvCaptureFromFile("result.avi");
	IplImage *pFrame;
	if(!capture)
		return -1;
	int h=540;
	int w=960;
	int winsize = 2 * max(h,w) / 50 + 1;

	for(;;)
	{
		if(!cvGrabFrame(capture))
			break;
		pFrame=cvRetrieveFrame(capture);

		if(!pFrame)
			break;
                
                fast_dehaze fdh;
	        fdh.init(h,w,winsize);

		fdh.doDehaze(pFrame);

		cvShowImage("result",fdh.get_result_image());

		if(cvWaitKey(10)>=0)
			break;
	}

	cvReleaseCapture(&capture);

	cvDestroyWindow("result");   
	return 0;
}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值