2011-04-14 18 views
0

私はOpenCV 2.2で作業しています。イメージが返された場合、イメージに割り当てられたメモリを解放する必要があるのでしょうか?私はメインプログラムから何度か呼び出されるmethod1(下記参照)を持っています。メソッド内で作成されたIplImageを返します。 メソッドで作成したイメージはどこから解放する必要がありますか?私がリターンコマンドの前にそれをリリースすれば、何も返されないだろうと思いますか?戻りコマンドの後、処理されません。では、私のプログラムのランタイム中に作成されたすべてのdstイメージを取り除くにはどうすればよいですか?イメージが返された場合は、cvReleaseImageが必要ですか?

IplImage* Method1(IplImage* src) { 
IplImage *dst = cvCreateImage(cvSize(src->width, src->height), IPL_DEPTH_8U, 1); 
[...] 
return dst; 
} 

Thx!

EDIT:その後、メインプログラムで正しくメモリを解放するために

IplImage* tmp; 
tmp = cvCreateImage(cvSize(dst->width, dst->height), IPL_DEPTH_8U, 1); 
tmp = Method1(src); 

または

IplImage* tmp; 
tmp = Method1(src); 

: は、だから私はこのように、このメソッドを呼び出す必要がありますか?

答えて

1

あなたは、関数内でメモリを割り当てることができます。あなたがDSTを使用した後、呼び出し機能で画像を返されたら、あなたは

2

いいえ、そうでないと、解放されたメモリへのポインタを返します。後でリリースされるはずの新しいイメージが返されていることを示す名前がMethod1であることを確認してください。

あなたはそれを外に出さなければならないでしょう(それを済ませたら)。

3
  1. あなたがC++を使用している場合は、あなたのために自動的にメモリ管理をしている、cv::Matを使用し、IplImage*を使用しないでください。
  2. あなたの最初の方法ではメモリリークが発生します(これはopencv特有のものではありません。何かのためにメモリを割り当ててからポインタを上書きしてアクセスできなくなります。それを解放する。
0

メモリリークが削除されているメモリをクリアするcvReleaseImage(& DST)を呼び出すことができますdstイメージ外部のように、次のとおりです。

void Method1(IplImage* src, IplImage* &dst) { 
[...] 
} 

IplImage* image0 = ...; 
IplImage* image1 = cvCreateImage(cvSize(image0->width, image0->height), IPL_DEPTH_8U, 1); 
Method1(image0, image1); 

、その後の画像の両方にcvReleaseImage(&...)を使用することを忘れないでください。

関連する問題