簡體   English   中英

此代碼中的內容導致C#中的內存泄漏?

[英]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位圖的副本; 因此,您可以在創建新圖像后立即使用GDI DeleteObject方法釋放傳入的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM