Domanda

Se ho un oggetto CImageList (un semplice wrapper attorno a un HIMAGELIST) e chiamo:

m_pImageList->Replace(...);  

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

Chi è responsabile per cancellare la memoria? L'elenco di immagini crea una copia di qualsiasi bitmap che passo (ovvero posso creare un oggetto CBitmap sullo stack e passare l'indirizzo di questo alla funzione)? O devo crearlo sull'heap e ricordare di liberare manualmente tutta la memoria quando l'elenco di immagini viene distrutto?

MSDN non è molto chiaro sull'argomento di chi è responsabile.

È stato utile?

Soluzione

Come dici tu, CImageList è un semplice wrapper attorno a un HIMAGELIST . CImageList :: Sostituisci chiama solo ImageList_Replace , la cui documentazione indica:

  

La funzione ImageList_Replace copia la bitmap in una struttura di dati interna. Assicurarsi di utilizzare la funzione DeleteObject per eliminare hbmImage e hbmMask dopo il ritorno della funzione.

Ciò significa che puoi creare un oggetto CBitmap nello stack, chiamare CImageList :: Sostituisci e l'elenco delle immagini prenderà una copia della bitmap dal Oggetto CBitmap . Quindi, quando l'oggetto CBitmap esce dall'ambito, il suo distruttore (o meglio, il CGdiObject distruttore di classe base) chiamerà DeleteObject per eliminare il bitmap. Poiché l'elenco di immagini copia tutte le bitmap aggiunte ad esso, dovrebbe eliminare la bitmap che è stata sostituita per te.

Quando viene eseguito il distruttore CImageList , viene chiamato ImageList_Destroy per eliminare il HIMAGELIST sottostante, che dovrebbe eliminare tutte le bitmap di proprietà dell'elenco di immagini .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top