C++ HDC内存泄漏(释放HDC/删除HDC)

C++ HDC内存泄漏(释放HDC/删除HDC),c++,memory-management,memory-leaks,gdi,C++,Memory Management,Memory Leaks,Gdi,我遇到了HDC内存泄漏的问题。你们能检查一下我是否正确地发布/删除了HDC吗 谢谢大家! BITMAP bm; HBITMAP hbmap; HBITMAP hBitmapOld; BITMAPINFO bmi; HDC hdcShot; TakeScreenShot Func(不太重要,但它显示了一些变量是如何初始化的) 我和DELEKERS核实了一下,发现我正在与HDC泄漏作斗争。我不确定我做错了什么。这里有资源泄漏: hbmap = CreateCompatibleBitmap(Get

我遇到了HDC内存泄漏的问题。你们能检查一下我是否正确地发布/删除了HDC吗

谢谢大家!

BITMAP bm;
HBITMAP hbmap;
HBITMAP hBitmapOld;
BITMAPINFO bmi;
HDC hdcShot;

TakeScreenShot Func(不太重要,但它显示了一些变量是如何初始化的)


我和DELEKERS核实了一下,发现我正在与HDC泄漏作斗争。我不确定我做错了什么。

这里有资源泄漏:

hbmap = CreateCompatibleBitmap(GetDC(0), rc.right - rc.left, rc.bottom - rc.top);
你应该换成

HDC hdc = GetDC(0);
CreateCompatibleBitmap(hdc, rc.right - rc.left, rc.bottom - rc.top);
... 
ReleaseDC(0, hdc);//call this before exiting the function
free(pPixels)
是错误的(尽管在这种情况下它仍然可以清除)。用
delete[]pPixels替换
free(pPixels)

更改此项:

SelectObject(hdcShot, hBitmapOld);
DeleteDC(hdcShot);
DeleteObject(hbmapNew);
DeleteDC(hdcShotNew);
为此:

SelectObject(hdcShot, OldBmp);
DeleteObject(hbmapNew);
DeleteObject(hBitmapOld);
DeleteDC(hdcShot);
DeleteDC(hdcShotNew);

您正在随机调用不同的函数。这是删除未初始化的变量,在DC中选择未初始化的对象,删除可能不应该删除的其他对象。这段代码行得通吗?行。这只是完整源代码的一部分。实际上,它工作得相当好。一点点泄漏的内存只是随着时间的推移累积起来的。@BarmakShemirani请查看我的可用内存函数。我想我可能错误地释放了内存。[添加了TakeScreenShot函数]您可以使用
std::vector
来存储像素,而无需原始指针,它将为您管理内存。@MarianSpanik我会尝试一下,但随着时间的推移,使用的大部分冗余高内存都是由HDCI造成的。我想这个答案可以总结一下。我明天回到电脑前会测试一下。非常感谢。引用这句话:总是先释放内存DC,然后释放位图,以避免常见的资源泄漏。“我不确定在这种情况下它是否会有什么不同,然而,@LaurieStearn这句话是胡说八道,不是资源泄漏是如何发生的。”。你必须遵循微软的建议,我重复了一遍。首先调用
SelectObject(hdcShotOldBmp)
。然后调用Deletexxx函数。Deletexxx函数可以是任意顺序的。@Barmak:我认为他的重点是将
DeleteDC
语句放在
DeleteObject
语句之前。只是好奇这条推理路线的动机?谢谢。@LaurieStearn这句话是错误的,我不知道背后的动机是什么。你可以问问写这封信的人。否则,请参阅有关此主题的Microsoft文档。
SelectObject(hdcShot, hBitmapOld);
DeleteDC(hdcShot);
DeleteObject(hbmapNew);
DeleteDC(hdcShotNew);
SelectObject(hdcShot, OldBmp);
DeleteObject(hbmapNew);
DeleteObject(hBitmapOld);
DeleteDC(hdcShot);
DeleteDC(hdcShotNew);