3

この関数はループしています。プログラムを実行すると、IntPtr の行でメモリの問題が発生します。delete[] を配置しましたが、それでもメモリの問題は解決しません。誰か助けてください。ありがとう

void showImage(IplImage *img,System::Windows::Forms::PictureBox^ picturebox)
{

IntPtr ip(new unsigned char[img->widthStep*img->height]); // this line causing memory usage to keep going up very fast

//memcpy(ip.ToPointer(),img->imageData,img->widthStep*img->height);

//picturebox->Image = gcnew Bitmap(img->width,img->height, img->widthStep, System:rawing::Imaging::PixelFormat::Format24bppRgb, ip);

delete[] ip;
} 

これは C++\CLI です

4

1 に答える 1

2

このコードがコンパイルされるのはかなり悲しいことですが、それは設計によるものです。マネージド型に適用された削除演算子は、実際にはメモリを解放しません。渡されたオブジェクトで IDisposable::Dispose() メソッドを呼び出します。これが機能するのはかなり悲しいことです。IntPtr はボックス化されてオブジェクトになり、IDisposable インターフェイスを実装しているかどうかがチェックされます。もちろんそうではありません、何も起こりません。

new演算子から返されたポインターを渡す必要があります。例外によってリークが発生しないように、finally ブロックでこれを行うことを忘れないでください。

ところで、コメントしたコードにはさらに複雑な問題があります。使用する Bitmap コンストラクターでは、IntPtr を有効に保つ必要があります。Bitmap が使用されなくなるまで、メモリを解放することはできません。したがって、削除の使用は実際には有効ではありません。代わりに Bitmap.LockBits() を使用して、独自のメモリを管理する Bitmap へのポインターを取得することを検討してください。そして、ストライドに注意してください。

于 2011-04-09T19:56:15.570 に答える