2017-08-19 10 views
1

私はOpenCVの新機能です。私は次のコードにメモリリークがあることに気づいた:OpenCV:cvCloneImageとメモリリーク

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イメージのクリーンなコピーを作成する簡単な方法があります(もちろん、データの各要素をコピーするためのループを書くことができます...)。あなたのメモリリークの問題に対する

+0

Cplでは 'IplImage *'の代わりに 'cv :: Mat'を使用することが推奨されています。これはこれらのポインタ参照を避けるためです。 – iamai

答えて

2

cvCreateImage画像に対してmemoryAを割り当てられ、cvCloneImage(コードに記載されているようimgに格納されているどのような値およびクローニング)memoryBを割り当て。 cvReleaseImage(&img_dest)はmemoryBの割り当てを解除するだけです。したがって、memoryAは参照されずに残されますが、割り当て解除されません。あなたのIPLイメージのコピーについては

は別のメモリを宣言し、コマンドcvCopyを使用し、私はそれを使用して任意の難しさを参照してくださいいけないし、それが安全かつ効率的です。

イメージ値を格納するためのデータバイトを割り当てずにIPLイメージヘッダーを宣言する場合は、CreateImageHeaderを代わりに使用してください。 cvCreateImagecvCreateImageHeadercvCreateDatacvReleaseImagecvReleaseImageHeadercvReleaseImageData、およびcvCloneImageのいずれかの時間をマスターすることをお勧めします。

+0

OK、ありがとう! – user8487873