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,

Другие вопросы по тегам