我对OpenCV很陌生。我注意到以下代码存在内存泄漏:
IplImage *img, *img_dest;
img = cvLoadImage("..\..\Sunset.jpg", CV_LOAD_IMAGE_COLOR);
while(1) // to make the mem leak obvious
{
img_dest = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 3);
img_dest = cvCloneImage(img);
cvReleaseImage( &img_dest );
}
cvReleaseImage( &img );
那么如何释放未引用的数据呢?有没有一种简单的方法来制作 IPL 图像的干净副本(当然我们可以编写一个循环来复制数据的每个元素......
对于内存泄漏问题:
cvCreateImage
为映像分配了内存 A,cvCloneImage
分配了内存 B(并克隆存储在img
中的任何值,如代码中所述(。cvReleaseImage(&img_dest)
仅释放内存 B,因此内存 A 未被引用,但不会解除分配。
对于 IPL 映像复制:
声明另一个内存并使用命令cvCopy
,我认为使用它没有任何困难,而且安全高效。
如果要声明 IPL 映像标头而不分配用于存储映像值的数据字节,请改用CreateImageHeader
。我建议你花一些时间掌握cvCreateImage
、cvCreateImageHeader
、cvCreateData
、cvReleaseImage
、cvReleaseImageHeader
、cvReleaseImageData
和cvCloneImage
。