[英]What in this code causes memory leak in C#?
在Windows任務管理器中,我發現我的程序的內存使用量在運行時會隨着時間的推移而增加。 內存泄漏是由下面的代碼引起的。 代碼是循環迭代圖像列表並根據MSDN中的代碼示例調整它們的大小。 似乎管理所有資源並使用.Dispose()釋放。
foreach ( string file in files )
{
image = Image.FromFile( file );
Rectangle cropRect = new Rectangle( 0, 0, 1000, 1000 );
Bitmap src = ( Bitmap ) image;
Bitmap target = new Bitmap( cropRect.Width, cropRect.Height );
using ( Graphics g = Graphics.FromImage( target ) )
{
g.DrawImage( src, new Rectangle( 0, 0, target.Width, target.Height ),
cropRect,
GraphicsUnit.Pixel );
}
image.Dispose();
image = Image.FromHbitmap( target.GetHbitmap() );
src.Dispose();
target.Dispose();
image.Dispose();
}
有人可以建議請問這段代碼中內存泄漏的原因是什么?
來自GetHbitmap
的文檔 :
您負責調用GDI
DeleteObject
方法來釋放GDI位圖對象使用的內存。 有關GDI位圖的更多信息,請參閱Windows GDI文檔中的位圖。
然后,從FromHbitmap
的文檔 :
FromHbitmap
方法制作GDI位圖的副本; 因此,您可以在創建新圖像后立即使用GDIDeleteObject
方法釋放傳入的GDI位圖。
看起來很清楚......你需要調用DeleteObject
:
[DllImport("gdi32.dll")]
private static extern bool DeleteObject(IntPtr hObject);
作為SJoshi指出,你應該使用using
塊,以確保Dispose
被稱為異常的情況。 DeleteObject
調用應位於finally
塊內以獲得相同的效果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.