2009-05-06 68 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,它應該刪除映像列表所擁有的所有位圖。