如何正确使用LoadImage和DeleteObject? 我正在使用C++编写Windows应用程序。我使用LoadImage将一个bmp文件加载到DC,它会正确显示。但是,当我调用DeleteObject时,内存似乎没有被释放。(我使用windows任务管理器跟踪内存使用情况)

如何正确使用LoadImage和DeleteObject? 我正在使用C++编写Windows应用程序。我使用LoadImage将一个bmp文件加载到DC,它会正确显示。但是,当我调用DeleteObject时,内存似乎没有被释放。(我使用windows任务管理器跟踪内存使用情况),c++,winapi,C++,Winapi,在WM_INITDIALOG部分中,我执行以下操作: static HBITMAP hBitmap = 0; char* tempPath = "tabView.bmp"; hBitmap = (HBITMAP)LoadImage(NULL, tempPath, // file containing bitmap IMAGE_BITMAP, // type = bitmap

在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_图片仍将显示图片,内存保持不变。我想知道SendMessage()是否会增加hBitmap上的ref计数


所以我的问题是:什么是正确的清理方法?

你没有提到你使用的是什么版本的Windows。无论如何,如果您阅读了的“重要”部分,您将看到下一步:

在Windows XP中,如果STM_SETIMAGE消息中传递的位图包含非零alpha的像素,则静态控件将获取位图的副本。此复制的位图由下一条STM_SETIMAGE消息返回。客户端代码可以独立跟踪传递给静态控件的位图,但如果它不检查并释放从STM_SETIMAGE消息返回的位图,则位图会泄漏。
也许这不仅适用于Windows XP,也适用于更高版本的Windows。希望这能对您有所帮助。

任务管理器不适合检查您是否泄漏。把这个放在一个永远运行的循环中,看看你的内存是否用完了。谢谢!!这就是正在发生的事情。这是一种处理资源的奇怪方式,不过。。。“此复制的位图由下一条STM_SETIMAGE消息返回”。如果我不想发送另一个STM_SETIMAGE怎么办?您可以记住原始返回值,并在准备删除该图像时将其发送回。