2 votes

Qui est responsable de libérer la mémoire des listes d'images?

Si j'ai un objet CImageList (une simple enveloppe autour d'un HIMAGELIST), et que j'appelle :

m_pImageList->Replace(...);  

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

Qui est responsable de libérer la mémoire? L'image list crée-t-elle une copie de n'importe quelle bitmap que je passe (c'est-à-dire, puis-je créer un objet CBitmap sur la pile puis passer l'adresse de celle-ci à la fonction)? Ou dois-je le créer sur le tas et me souvenir de libérer manuellement toute la mémoire lorsque l'image list est détruite?

MSDN n'est pas très clair à ce sujet de qui est responsable.

3voto

ChrisN Points 10734

Comme vous le dites, CImageList est simplement un wrapper autour d'un HIMAGELIST. CImageList::Remplacer appelle simplement ImageList_Replace, dont la documentation indique :

La fonction ImageList_Replace copie le bitmap dans une structure de données interne. Assurez-vous d'utiliser la fonction DeleteObject pour supprimer hbmImage et hbmMask après que la fonction ait retourné.

Cela signifie que vous pouvez créer un objet CBitmap sur la pile, appeler CImageList::Replace, et la liste d'images prendra une copie du bitmap de l'objet CBitmap. Ensuite, lorsque l'objet CBitmap sortira de portée, son destructeur (ou plutôt, le destructeur de la classe de base CGdiObject) appellera DeleteObject pour supprimer le bitmap. Parce que la liste d'images copie tous les bitmaps qui lui sont ajoutés, elle devrait supprimer le bitmap qui a été remplacé pour vous.

Lorsque le destructeur de CImageList s'exécute, cela appelle ImageList_Destroy pour supprimer le HIMAGELIST sous-jacent, ce qui devrait supprimer tous les bitmaps possédés par la liste d'images.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X