2011-04-09 218 views
3

此功能處於循環狀態。當我運行程序時,與IntPtr的行給我內存問題,我已經把刪除[],但它仍然不能解決內存問題,任何人都可以幫忙嗎?感謝IntPtr導致內存泄漏?

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

+1

你至少能說出這是什麼語言和平臺? – 2011-04-09 19:35:55

+0

是啊,這是C++ \ cli – Qmage 2011-04-09 19:38:40

+1

什麼*內存問題*? – 2011-04-09 19:39:48

回答

2

這是相當可悲的,這個代碼編譯,但這是由設計。應用於託管類型的刪除操作符實際上不釋放任何內存。它在傳遞的對象上調用IDisposable :: Dispose()方法。令人傷心的是,這甚至可以起作用,IntPtr會將它變成一個對象,然後檢查它是否實現了IDisposable接口。當然,沒有任何反應。

您必須將指針從新的運算符中傳回。不要忘記在finally塊中這樣做,所以異常不會導致泄漏。

順便說一下,你評論的代碼有更多的複雜性。您使用的位圖構造函數要求您保持IntPtr有效,直到不再使用位圖時才能釋放內存。所以使用delete實際上並不有效。考慮使用Bitmap.LockBits()來獲取指向管理自己內存的位圖的指針。並小心邁步。

+0

如何傳遞我從新運算符返回的指針?你能否展示一些片段,非常感謝 – Qmage 2011-04-09 20:04:39

+0

Martinho已經向你展示了。注意我添加的段落。 – 2011-04-09 20:05:46

+0

雅,就像你說的,在改爲Martinho建議的代碼之後,內存問題就解決了,但是我的picturebox卻無法正常加載。 – Qmage 2011-04-09 20:10:22