OpenCV: cvCloneImage и утечка памяти
Я очень новичок в 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 (конечно, мы могли бы написать цикл для копирования каждого элемента данных...).
1 ответ
Для вашей утечки памяти:
cvCreateImage
выделенная память A для изображения, и cvCloneImage
выделенная память B (и клонирование любого значения, хранящегося в img
как указано в вашем коде). cvReleaseImage(&img_dest)
только освобождает память B, таким образом, память A остается без ссылки, но не освобождается.
Для копирования изображений IPL:
Объявите другую память и используйте команду cvCopy
Я не вижу никаких сложностей в его использовании, и это безопасно и эффективно.
Если вы хотите объявить заголовок изображения IPL без выделения байта данных для хранения значения изображения, используйте CreateImageHeader
вместо. Я бы посоветовал вам потратить некоторое время на освоение cvCreateImage
, cvCreateImageHeader
, cvCreateData
, cvReleaseImage
, cvReleaseImageHeader
, cvReleaseImageData
а также cvCloneImage
,