作者llama (阿譽)
看板C_and_CPP
標題[問題] gcnew 甚麼情況需要作 delete ??
時間Thu Oct 29 12:22:02 2009
遇到的問題: (題意請描述清楚)
gcnew 動態產生的記憶體,.NET garbage collection 並未幫我釋放。
開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux)
Visual Studio 2005 with .NET Framework 2.0
有問題的code: (請善用置底文標色功能)
void ROIFilter(Byte *dataPtr, int width, int height,
int start, int end, int base)
{
Rectangle region = Rectangle(0, 0, width, height);
Bitmap ^regionImage = (gcnew System::Drawing::Bitmap(width, height));
Graphics ^regionImageGraphics = Graphics::FromImage(regionImage);
GraphicsUnit units = GraphicsUnit::Pixel;
regionImageGraphics->DrawImage(m_ProcessImage, region, region, units);
delete regionImageGraphics;
// 取得 regionImage 的 BitmapData (LockBits)
// 開始處理
// UnLockBits
delete regionImage; ->
不加就不釋放
}
補充說明:
我是從一個 .avi 檔案中取得每一張影像,然後只針對我感興趣的部分作處理,所以為了
方便起見,我把要處理的 Bitmap,複製 ROI 到 regionImage,就開始處理,不過我突然
發現記憶體不斷增加,造成我一個30~40秒的影片檔,記憶體上升140MB左右,處理完也沒
降回來,然後我做了最後那一行「delete regionImage;」,記憶體使用量就正常了,所
以我蠻疑惑這是為什麼?
謝謝 :)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.115.25.4
※ 編輯: llama 來自: 140.115.25.4 (10/29 12:23)
→ james732:gc機制不會"馬上"回收 10/29 12:30
→ llama:我知道啊!!但是影片播完後!!等了幾分鐘,記憶體還是沒釋放~ 10/29 23:58
→ llama:去找找有沒有相關文件好了~ 10/29 23:58
推 ledia:resource 用完設成 NULL 呢? 10/30 11:44
→ ledia:理論上 gc 會在他確定你不會再用到該物件才會回收 10/30 11:45
→ ledia:或者參考上面那頁 10/30 11:54