用于HBITMP的函数DestroyObject不能很好地工作(内存泄漏)

WIndows function DestroyObject for HBITMP doesn't work very well (memory leak)

本文关键字:工作 内存 泄漏 很好 HBITMP 函数 DestroyObject 不能 用于      更新时间:2023-10-16

我需要在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 函数中,您将在设备上下文中选择位图,但不会再次将其选中,因此当您尝试删除它时,它仍然是设备上下文的一部分。

顺便说一句,您的上下文也没有正确释放,您选择的所有其他对象也没有正确释放。你那里发生了一些巨大的内存泄漏。当然,您不会向我们展示代码,因此无法为您提供详细信息。

最后一点,我并不完全明白为了发布它而一遍又一遍地创建新位图背后的原因。您应该在循环之外创建它,然后是设备上下文,然后将其选择到设备上下文中,然后开始循环并清除位图以开始在其上写入。您将获得巨大的性能提升。