2

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

m_pImageList->Replace(...);  

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

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

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

4

1 回答 1

3

正如你所说,CImageList是一个简单的包装器HIMAGELISTCImageList::Replace只需调用ImageList_Replace,其文档说明:

ImageList_Replace函数将位图复制到内部数据结构。一定要使用DeleteObject函数删除hbmImagehbmMask函数返回后。

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

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

于 2009-05-06T19:06:57.473 回答