2013-03-31 2 views
1

У меня проблема с утечками памяти. В этой простой программе:Утечки памяти C и OpenCV

#include <stdlib.h> 
#include <stdio.h> 
#include "opencv2/core/core.hpp" 
#include "opencv2/highgui/highgui.hpp" 

int main() { 
    CvMat *src; 
    src = cvLoadImageM("p1.jpg", CV_LOAD_IMAGE_GRAYSCALE); 
    cvSaveImage("p2.bmp", src, 0); 
    cvReleaseMat(&src); 
    return 0; 
} 

Согласно Valgrind, есть 7 утечки:

==10478== HEAP SUMMARY: 
==10478==  in use at exit: 10,464 bytes in 7 blocks 
==10478== total heap usage: 154 allocs, 147 frees, 2,908,450 bytes allocated 
==10478== 
==10478== LEAK SUMMARY: 
==10478== definitely lost: 0 bytes in 0 blocks 
==10478== indirectly lost: 0 bytes in 0 blocks 
==10478==  possibly lost: 0 bytes in 0 blocks 
==10478== still reachable: 10,464 bytes in 7 blocks 
==10478==   suppressed: 0 bytes in 0 blocks 
==10478== Rerun with --leak-check=full to see details of leaked memory 
==10478== 
==10478== For counts of detected and suppressed errors, rerun with: -v 
==10478== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2) 

Может кто-нибудь сказать мне, как правильно освободить память? Спасибо за ваш совет.

+8

Вы не продемонстрировали, что у вас есть утечка памяти, только то, что valgrind жалуется на одно. В сложных библиотеках иногда используются шаблоны распределения, которые ошибочно воспринимаются как утечки с помощью таких инструментов, как valgrind. (Пример включает пулы распределения или не запускать деструкторы при выходе из соображений производительности.) Простой способ проверить, имеете ли вы дело с реальной утечкой памяти или нет, это обернуть все содержимое 'main()' (кроме 'return') в бесконечном цикле. Начните процесс и наблюдайте его с помощью 'top' или эквивалентного инструмента: если его память растет без границ, * то * у вас есть утечка под рукой. – user4815162342

ответ

1

@ пользователь4815162342, вероятно, прав. Хотя я рекомендую вам перейти на новый C++OpenCvcv::Mat, через который автоматическое управление памятью.

-1

Я видел эту утечку много раз. Проверьте подробные ошибки выше того, что вы отправили. Это, наверное, pixman lib.

Смежные вопросы