Chi è responsabile per cancellare la memoria dagli elenchi di immagini?
-
06-07-2019 - |
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.
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 funzioneDeleteObject
per eliminarehbmImage
ehbmMask
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 .