2016-03-03 102 views
1

我正在開發一個簡單的C#winform應用程序。 我創建一個位圖並獲得一個位圖句柄。 並使用位圖句柄。位圖和句柄內存泄漏

那時候,我配置位圖的時候,是位圖處理空閒內存嗎? 而當我使用DeleteObject方法釋放內存句柄時,是位圖處理?

感謝您的建議。

----------- ------------編輯

int prevCookie = 0; 
private void testMethod(object sender, EventArgs e) 
{ 
    Bitmap bmp = new Bitmap(100, 100); 
    using (Graphics g = Graphics.FromImage(bmp)) 
    { 
     //Draw some shapes on bitmap 
    } 
    int hBitmap = bmp.GetHBitmap().ToInt32(); 
    //I used intel media sdk library. 
    int newCookie; 
    intelMediaSdkVariable.AddImageFromHandle(hBitmap, out newCookie); 
    if (prevCookie > 0) 
     intelMediaSdkVariable.RemoveItem2(prevCookie); 
    prevCookie = newCookie; 
    bmp.Dispose(); 
} 

當時,當我打電話TestMethod的1000倍,內存增加。 當我打電話給bmp.Dispose()時,hBitmap是免費的嗎? 我該如何解決它?

+0

可能。取決於代碼 – Plutonix

+1

Plutonix你應該發佈它作爲答案:) – Sakura

+0

我們需要看到_how_是否創建位圖爲例。對於我們所知道的所有你正在使用p-invoke。 _「我創建一個位圖,並獲得一個位圖句柄」_擔心我 – MickyD

回答

1

您忘記刪除hBitmap手柄。

int prevCookie = 0; 
private void testMethod(object sender, EventArgs e) 
{ 
    Bitmap bmp = new Bitmap(100, 100); 
    using (Graphics g = Graphics.FromImage(bmp)) 
    { 
     //Draw some shapes on bitmap 
    } 
    int hBitmap = bmp.GetHBitmap().ToInt32(); 
    //I used intel media sdk library. 
    int newCookie; 
    intelMediaSdkVariable.AddImageFromHandle(hBitmap, out newCookie); 
    if (prevCookie > 0) 
     intelMediaSdkVariable.RemoveItem2(prevCookie); 
    prevCookie = newCookie; 
    DeleteObject((IntPtr)hBitmap); // <---------- You dont have this line. 
    bmp.Dispose(); 
} 

[System.Runtime.InteropServices.DllImport("gdi32.dll")] 
public static extern bool DeleteObject(IntPtr hObject); 

我不使用英特爾媒體SDK庫,因此,如果婁代碼有內存泄漏或不,我不能說:

int newCookie; 
intelMediaSdkVariable.AddImageFromHandle(hBitmap, out newCookie); 
if (prevCookie > 0) 
    intelMediaSdkVariable.RemoveItem2(prevCookie); 
prevCookie = newCookie; 
+0

您的意思是刪除句柄並同時處理位圖。 配置位圖不釋放句柄內存。對? – Zuiche

+0

[GetHBitmap](https://msdn.microsoft.com/en-us/library/1dz311e4(v = vs.110).aspx)創建新對象,所以'bmp'&'hBitmap'是兩個不同的對象。你的代碼只處理一個。 – Sakura

+0

感謝您的回覆。 – Zuiche