2009-05-06 6 views
2

Wenn ich ein CImageList Objekt (eine einfache Wrapper um eine HIMAGELIST), und ich rufe:Wer ist verantwortlich für das Löschen von Speicher aus Bildlisten?

m_pImageList->Replace(...); 

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

Wer für Aufräumen des Speichers zuständig? Erstellt die Bildliste eine Kopie einer Bitmap, die ich übergebe (d. H. Kann ich ein CBitmap-Objekt auf dem Stapel erstellen und die Adresse an die Funktion übergeben)? Oder muss ich es auf dem Heap erstellen und daran denken, den gesamten Speicher manuell freizugeben, wenn die Bildliste zerstört wird?

MSDN ist nicht sehr klar zum Thema, wer verantwortlich ist.

Antwort

3

Wie Sie sagen, ist CImageList ein einfacher Wrapper um eine HIMAGELIST. CImageList::Replace nennt nur ImageList_Replace, deren Dokumentation heißt es:

Die ImageList_Replace Funktion kopiert die Bitmap auf eine interne Datenstruktur. Stellen Sie sicher, dass Sie die Funktion DeleteObject verwenden, um hbmImage und hbmMask zu löschen, nachdem die Funktion zurückgegeben wurde.

Dies bedeutet, dass Sie auf dem Stapel ein CBitmap Objekt erstellen können, rufen CImageList::Replace, und die Bildliste eine Kopie des Bitmap aus dem CBitmap Objekt nehmen. Wenn das Objekt CBitmap den Gültigkeitsbereich verlässt, ruft sein Destruktor (oder besser der Basisklassendestruktor CGdiObject) DeleteObject auf, um die Bitmap zu löschen. Da die Bildliste alle hinzugefügten Bitmaps kopiert, sollte sie die Bitmap löschen, die für Sie ersetzt wurde.

Wenn der Destruktor CImageList ausgeführt wird, ruft dieser ImageList_Destroy auf, um das zugrunde liegende HIMAGELIST zu löschen, das alle Bitmaps löschen sollte, die der Abbildliste gehören.