2009-05-06 6 views
2

私はCImageListオブジェクト(HIMAGELIST簡単なラッパ)を持っている、と私は呼び出す場合:メモリをクリアするための責任がある画像リストからメモリを消去する責任は誰にありますか?

m_pImageList->Replace(...); 

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

?イメージリストは、渡されたビットマップのコピーを作成しますか(つまり、スタック上にCBitmapオブジェクトを作成し、このアドレスを関数に渡すことはできますか)。または、ヒープ上に作成し、イメージリストが破棄されたときに手動ですべてのメモリを解放する必要がありますか?

MSDNは、誰が責任を持っているのかについてはあまり明確ではありません。

答えて

3

CImageListは、HIMAGELISTを囲む単純なラッパーです。内部データ構造に

ImageList_Replace機能コピービットマップ:CImageList::Replaceはちょうどそのドキュメントの状態ImageList_Replaceを呼び出します。関数が返された後には、DeleteObject関数を使用してhbmImageおよびhbmMaskを削除してください。

これは、スタック上にCBitmapオブジェクトを作成CImageList::Replaceを呼び出すことができることを意味し、イメージリストがCBitmapオブジェクトからビットマップのコピーを取ります。次に、CBitmapオブジェクトが有効範囲外になると、そのデストラクタ(つまり、CGdiObjectベースクラスのデストラクタ)がDeleteObjectを呼び出してビットマップを削除します。イメージリストは、追加されたビットマップをコピーするので、置き換えられたビットマップを削除する必要があります。

CImageListデストラクタを実行すると、ImageList_Destroyが呼び出され、基底のHIMAGELISTが削除され、画像リストが所有するすべてのビットマップが削除されます。

関連する問題