2009-08-11 6 views
0

Ich versuche mit GDI + zu arbeiten und stoße auf ein komisches Speicherleck. Ich habe eine vector von GdiplusBase Zeigern, alle von ihnen dynamisch erstellt. Das Seltsame ist, ist jedoch, dass, wenn ich versuche, die Objekte als GdiplusBase Zeiger zu löschen, zum BeispielGDI + verliert Speicher beim Löschen von Zeigern als GdiplusBase *?

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

Das Objekt wird nicht gelöscht und Speicherlecks (nach Task-Manager). Wenn ich jedoch auf den ursprünglichen Zeiger zurückgeworfen und anschließend gelöscht habe, wird das Objekt korrekt gelöscht.

delete (Image*)gdiplus[0]; 

Das Seltsame daran ist, soweit ich das beurteilen kann, dass (nach MSDN) GdiplusBase is the base class of all GDI+ objects and owns the delete operators for all of them. Sollte in diesem Fall nicht delete gdiplus[0]; korrekt funktionieren und den Speicher freigeben? Mache ich hier etwas falsch?

Antwort

0

Ich würde das Problem vorstellen, dass GdiplusBase kein virtuelles destructor hat, und so, wenn Sie delete so nennen, ist kein Destruktor aufgerufen. Und der Destruktor von Image gibt wahrscheinlich einige andere Ressourcen frei (z. B. Bitmap-Handles usw.). So wird der Speicher für das Objekt selbst korrekt freigegeben, aber andere Ressourcen, die es verwendet (die auch Speicher belegen können), werden nicht freigegeben.

Verwandte Themen