2009-08-11 5 views
0

GDI +로 작업하려고하는데 이상한 메모리 누수가 발생합니다. 나는 GdiplusBase 포인터의 vector을 가지고 있으며, 모두 동적으로 생성됩니다. 이상한 점은, 그러나,이다 것을 나는GdiplusBase *로 포인터를 삭제할 때 GDI +에서 메모리 누수가 발생합니까?

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

개체를 삭제하고 메모리 누수 (작업 관리자에 따라)되지 않으며, 예를 들면 GdiplusBase 포인터로 개체를 삭제하려고합니다. 그러나 원래 포인터로 다시 캐스트 한 다음 삭제하면

delete (Image*)gdiplus[0]; 

개체가 올바르게 삭제됩니다. 이것에 관한 이상한 점은, 내가 말할 수있는 한, (MSDN에 의하면) GdiplusBase is the base class of all GDI+ objects and owns the delete operators for all of them입니다. 이 경우 delete gdiplus[0];이 올바르게 작동하고 메모리를 비우지 않아야합니까? 내가 여기서 뭐 잘못하고 있니?

답변

0

GdiplusBase에는 가상 소멸자가 없으므로 delete을 호출하면 소멸자가 호출되지 않는다고 생각합니다. Image의 소멸자는 다른 리소스 (비트 맵 핸들 등)를 공개 할 가능성이 큽니다. 따라서 Image개체 자체의 메모리는 올바르게 해제되지만 사용중인 다른 리소스 (메모리를 사용할 수도 있음)는 해제되지 않습니다.

관련 문제