如果我有一个 CImageList 对象(一个 HIMAGELIST 的简单包装器),并且我调用:
m_pImageList->Replace(...);
http://msdn.microsoft.com/en-us/library/k10cwcdb.aspx
谁负责清理内存?图像列表是否创建我传入的任何位图的副本(即我可以在堆栈上创建一个 CBitmap 对象,然后将其地址传递给函数)吗?或者我必须在堆上创建它并记住在图像列表被销毁时手动释放所有内存?
MSDN 对于谁负责的问题不是很清楚。
最佳答案
正如您所说,CImageList
是 HIMAGELIST
的简单包装。 CImageList::Replace
只是调用 ImageList_Replace
,其文档指出:
The
ImageList_Replace
function copies the bitmap to an internal data structure. Be sure to use theDeleteObject
function to deletehbmImage
andhbmMask
after the function returns.
这意味着您可以在堆栈上创建一个CBitmap
对象,调用CImageList::Replace
,图像列表将从CBitmap中获取位图的副本>CBitmap
对象。然后,当 CBitmap
对象超出范围时,其析构函数(或者更确切地说,CGdiObject
基类析构函数)将调用 DeleteObject
来删除位图。由于图像列表会复制添加到其中的所有位图,因此它应该删除为您替换的位图。
当CImageList
析构函数执行时,它会调用ImageList_Destroy
来删除底层的HIMAGELIST
,这应该删除图像列表拥有的所有位图.
关于winapi - 谁负责清除图像列表中的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/829075/