用于HBITMP的函数DestroyObject不能很好地工作(内存泄漏)
WIndows function DestroyObject for HBITMP doesn't work very well (memory leak)
我需要在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
函数中,您将在设备上下文中选择位图,但不会再次将其选中,因此当您尝试删除它时,它仍然是设备上下文的一部分。
顺便说一句,您的上下文也没有正确释放,您选择的所有其他对象也没有正确释放。你那里发生了一些巨大的内存泄漏。当然,您不会向我们展示代码,因此无法为您提供详细信息。
最后一点,我并不完全明白为了发布它而一遍又一遍地创建新位图背后的原因。您应该在循环之外创建它,然后是设备上下文,然后将其选择到设备上下文中,然后开始循环并清除位图以开始在其上写入。您将获得巨大的性能提升。
- 为什么它在不分配内存的情况下工作正常
- 自定义内存管理器在发布模式下工作正常,但在调试模式下则不然
- 如果类数组中的向量是动态push_backed的,内存如何工作
- C 编程,动态内存无法使用Malloc和Calloc正常工作
- 读取进程内存无法正常工作,使用 UTF16 字符串
- QSerialBus 工作中的内存泄漏
- OpenCL:动态内存分配,是使用空闲工作项更好还是同时写入更好
- C++动态内存分配未按预期工作
- 如果malloc/free对显然做了同样的工作,为什么C++标准库容器使用内存池
- std::共享内存中的互斥对象不工作
- 我不明白放置新的工作方式以及如何释放内存
- 我应该为等待工作线程的主线程使用哪种内存顺序
- 有可能实现一个与数组而不是单个对象一起工作的内存池吗
- 动态内存复制是如何工作的
- 内存屏障:如何确保工作线程可以看到初始化写入?
- 我已经将虚拟内存设置为20GB,但由于内存不足,代码仍然无法工作
- 你能给我一个内存泄漏的真实工作示例吗?
- 动态内存分配是如何工作的
- 在堆上分配内存或传递工作内存
- 用于HBITMP的函数DestroyObject不能很好地工作(内存泄漏)