谁负责清理图像列表中的内存?

时间:2009-05-06 11:00:11

标签: winapi mfc memory-management imagelist

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

m_pImageList->Replace(...);  

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

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

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

1 个答案:

答案 0 :(得分:3)

正如您所说,CImageListHIMAGELIST的简单包装器。 CImageList::Replace只需调用ImageList_Replace,其文档说明:

  

ImageList_Replace函数将位图复制到内部数据结构。在函数返回后,请务必使用DeleteObject函数删除hbmImagehbmMask

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

执行CImageList析构函数时,会调用ImageList_Destroy删除基础HIMAGELIST,这将删除图像列表所拥有的所有位图。