Кто несет ответственность за очистку памяти из списков изображений? - PullRequest
2 голосов
/ 06 мая 2009

Если у меня есть объект CImageList (простая оболочка вокруг HIMAGELIST), и я вызываю:

m_pImageList->Replace(...);  

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

Кто несет ответственность за очистку памяти? Создает ли список изображений копию любого растрового изображения, которое я передаю (т. Е. Могу ли я создать объект CBitmap в стеке, а затем передать адрес этого функции)? Или я должен создать его в куче и не забыть вручную освободить всю память, когда список изображений уничтожен?

В MSDN не очень ясно, кто виноват.

1 Ответ

3 голосов
/ 06 мая 2009

Как вы говорите, CImageList - это простая оболочка вокруг HIMAGELIST. CImageList::Replace просто звонит ImageList_Replace, документация которого гласит:

Функция ImageList_Replace копирует растровое изображение во внутреннюю структуру данных. Обязательно используйте функцию DeleteObject для удаления hbmImage и hbmMask после возврата из функции.

Это означает, что вы можете создать объект CBitmap в стеке, вызвать CImageList::Replace, и список изображений получит копию растрового изображения из объекта CBitmap. Затем, когда объект CBitmap выходит из области видимости, его деструктор (точнее, деструктор базового класса * 1021) вызовет DeleteObject, чтобы удалить растровое изображение. Поскольку список изображений копирует все добавленные в него растровые изображения, он должен удалить замененное растровое изображение.

Когда выполняется деструктор CImageList, это вызывает ImageList_Destroy для удаления базового HIMAGELIST, который должен удалить все растровые изображения, принадлежащие списку изображений.

...