2012-04-11 88 views
2

我正在使用C++編寫Windows應用程序。我使用LoadImage將一個bmp文件加載到DC,並且它正常顯示。但是,當我調用DeleteObject時,內存似乎不會被釋放。 (我使用Windows任務管理器來跟蹤內存使用情況)如何正確使用LoadImage和DeleteObject?

在WM_INITDIALOG部分我這樣做:

static HBITMAP hBitmap = 0; 
char* tempPath = "tabView.bmp"; 
hBitmap = (HBITMAP)LoadImage(NULL, 
          tempPath, // file containing bitmap 
          IMAGE_BITMAP, // type = bitmap 
          0, 0,  // original size 
          LR_LOADFROMFILE);  // get image from a file 
if(hBitmap) 
{ 
    SendMessage(GetDlgItem(hwndDlg, IDC_PICTURE), 
       STM_SETIMAGE,   // message to send 
       (WPARAM)IMAGE_BITMAP, // bitmap type 
       (LPARAM)hBitmap);  // bitmap handle 
} 

所以畫面顯示了在DC,和內存增加。並在按鈕我:

int result = DeleteObject(hBitmap); 

當我按下按鈕,我檢查結果,它是一個非零值,這是成功。但是IDC_PICTURE仍然會顯示圖片,並且內存保持不變。我想知道是否SendMessage()可能會增加對hBitmap的參考計數...

所以我的問題是:什麼是清理的正確方法?

+1

任務管理器不適合檢查您是否泄漏。把它放在一個永久運行的循環中,看看你是否用完了內存。 – 2012-04-11 20:05:22

回答

1

您沒有提及您使用的Windows版本。無論如何,如果你讀的STM_SETIMAGE「重要」的一部分,你接下來會看到:

在Windows XP中,如果在STM_SETIMAGE消息傳遞的位圖包含非零Alpha像素,靜態控制採用位圖的副本。該複製的位圖由下一個STM_SETIMAGE消息返回。客戶端代碼可以獨立地跟蹤傳遞給靜態控件的位圖,但是如果它不檢查並釋放從STM_SETIMAGE消息返回的位圖,位圖就會泄漏。

也許這不僅適用於Windows XP,而且適用於更高版本的Windows。希望這會幫助你。

+0

謝謝!這正是發生的事情。這種處理資源的奇怪方法,雖然......「這個複製的位圖由下一個STM_SETIMAGE消息返回」。如果我不想發送另一個STM_SETIMAGE,該怎麼辦? – laishiekai 2012-04-11 20:58:11

+0

您可以記住原始返回值,並在準備好擺脫圖像時將其返回。 – 2012-04-12 00:09:56