2009-05-06 67 views
2

如果我有一个CImageList对象(周围HIMAGELIST一个简单的包装),我称之为:谁负责清理图像列表中的内存?

m_pImageList->Replace(...); 

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

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

关于谁负责的主题,MSDN并不十分清楚。

回答

3

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

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

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

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