winapi - 谁负责清除图像列表中的内存?

标签 winapi mfc memory-management imagelist

如果我有一个 CImageList 对象(一个 HIMAGELIST 的简单包装器),并且我调用:

m_pImageList->Replace(...);  

http://msdn.microsoft.com/en-us/library/k10cwcdb.aspx

谁负责清理内存?图像列表是否创建我传入的任何位图的副本(即我可以在堆栈上创建一个 CBitmap 对象,然后将其地址传递给函数)吗?或者我必须在堆上创建它并记住在图像列表被销毁时手动释放所有内存?

MSDN 对于谁负责的问题不是很清楚。

最佳答案

正如您所说,CImageListHIMAGELIST 的简单包装。 CImageList::Replace 只是调用 ImageList_Replace ,其文档指出:

The ImageList_Replace function copies the bitmap to an internal data structure. Be sure to use the DeleteObject function to delete hbmImage and hbmMask after the function returns.

这意味着您可以在堆栈上创建一个CBitmap对象,调用CImageList::Replace,图像列表将从CBitmap中获取位图的副本>CBitmap 对象。然后,当 CBitmap 对象超出范围时,其析构函数(或者更确切地说,CGdiObject 基类析构函数)将调用 DeleteObject 来删除位图。由于图像列表会复制添加到其中的所有位图,因此它应该删除为您替换的位图。

CImageList析构函数执行时,它会调用ImageList_Destroy来删除底层的HIMAGELIST,这应该删除图像列表拥有的所有位图.

关于winapi - 谁负责清除图像列表中的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/829075/

相关文章:

c - 将非 BMP 代码点写入控制台

c++ - #include "MyClass.h"和 #include ".\myclass.h"有什么区别

c++ - 为什么我的类析构函数会立即被调用?

多次调用malloc

c - 我无法使用 SHFileOperation 删除文件

c++ - Win32 API 中 PathAppend 和 PathCombine 的区别

c++ - 枚举 HWND 属性 C++

c++ - 我怎么知道一个项目是不是MFC应用程序

linux - fork() & 内存分配行为

javascript - WebSocket频繁onmessage零拷贝