我需要在C++程序中经常创建HBITMAP图像,当然我需要在使用后删除这些位图。代码与此类似
HBITMAP hBmp;
while(true) {
hBmp = CreateBitmap(width, height, 1, 8, imageData);
process(hBmp);
DeleteObject(hBmp);
}
我在线程中有一个无限循环,该线程不断创建 HBITMAP,调用使用此位图的函数,然后将其删除。在循环开始时,我检查进程内存使用量是否大于上一个周期,如果是,我打印它。使用 CreateBitmap() 和 DeleteObject() 会导致少量内存泄漏;进程内存使用量偶尔增加 4KB(有时每 10 秒一次,有时几分钟什么都没有发生)。
我在没有调用进程函数的情况下也对其进行了测试,问题仍然存在,所以我认为是由于位图处理造成的。此外,我还进行了另一项测试,在无限循环之外创建图像(所以我只创建一次)并在循环中多次处理它,并且不会发生内存泄漏。
注意:DeleteObject() 始终返回值>0(无错误)。
问题是否可能与 DeleteObject() 函数有关?以这种方式创建/删除位图有什么问题吗?
技术说明:视窗 XP博兰德C++建造者 5
可能在设备上下文中的某个位置仍选择位图?这可能会导致 DeleteObject 失败,尽管我希望它会返回错误。
有趣的是,问题通常出在人们不显示的代码中。
在 process
函数中,您将在设备上下文中选择位图,但不会再次将其选中,因此当您尝试删除它时,它仍然是设备上下文的一部分。
顺便说一句,您的上下文也没有正确释放,您选择的所有其他对象也没有正确释放。你那里发生了一些巨大的内存泄漏。当然,您不会向我们展示代码,因此无法为您提供详细信息。
最后一点,我并不完全明白为了发布它而一遍又一遍地创建新位图背后的原因。您应该在循环之外创建它,然后是设备上下文,然后将其选择到设备上下文中,然后开始循环并清除位图以开始在其上写入。您将获得巨大的性能提升。