GDI+ дает утечку памяти при удалении указателей как GdiplusBase*?

Я пытаюсь работать с GDI+ и сталкиваюсь со странной утечкой памяти. У меня есть vector из GdiplusBase указателей, все они создаются динамически. Однако странно то, что если я попытаюсь удалить объекты как указатели GdiplusBase, например,

vector<GdiplusBase*> gdiplus;
gdiplus.push_back(new Image(L"filename.jpg"));
delete gdiplus[0];

Объект не удаляется и происходит утечка памяти (по данным диспетчера задач). Однако, если я вернусь к исходному указателю, а затем удалю,

delete (Image*)gdiplus[0];

Объект корректно удален. Насколько я могу судить, странно то, что (согласно MSDN) GdiplusBase — это базовый класс всех объектов GDI+, которому принадлежат операторы удаления для всех них. В таком случае delete gdiplus[0]; не должен работать правильно и освобождать память? Я делаю что-то не так здесь?


person Community    schedule 11.08.2009    source источник


Ответы (1)


Я бы предположил, что проблема в том, что GdiplusBase не имеет виртуального деструктора, и поэтому, когда вы вызываете delete таким образом, деструктор не вызывается. И деструктор Image, вероятно, освобождает некоторые другие ресурсы (например, дескрипторы растрового изображения и т. д.). Таким образом, память для самого Image объекта освобождается правильно, но другие используемые им ресурсы (которые также могут занимать память) не освобождаются.

person Pavel Minaev    schedule 12.08.2009