如果我有一个CImageList对象(一个围绕HIMAGELIST的简单包装器),我会调用:
m_pImageList->Replace(...);
http://msdn.microsoft.com/en-us/library/k10cwcdb.aspx
谁负责清理记忆?图像列表是否创建了我传入的任何位图的副本(即我可以在堆栈上创建CBitmap对象,然后将其地址传递给函数)?或者我必须在堆上创建它并记得在图像列表被销毁时手动释放所有内存吗?
MSDN对谁负责的主题不是很清楚。
答案 0 :(得分:3)
正如您所说,CImageList
是HIMAGELIST
的简单包装器。 CImageList::Replace
只需调用ImageList_Replace
,其文档说明:
ImageList_Replace
函数将位图复制到内部数据结构。在函数返回后,请务必使用DeleteObject
函数删除hbmImage
和hbmMask
。
这意味着您可以在堆栈上创建CBitmap
对象,调用CImageList::Replace
,图像列表将从CBitmap
对象获取位图的副本。然后,当CBitmap
对象超出范围时,其析构函数(或更确切地说,CGdiObject
基类析构函数)将调用DeleteObject
来删除位图。由于图像列表会复制添加到其中的任何位图,因此应删除为您替换的位图。
执行CImageList
析构函数时,会调用ImageList_Destroy
删除基础HIMAGELIST
,这将删除图像列表所拥有的所有位图。