Löschen eines abgeleiteten Objekts über einen Zeiger auf seine Basisklasse

7

Ich habe zwei Klassen, base_class und derived_class und den folgenden Code:

%Vor%

Wird dieser Code ein Speicherleck erzeugen? Wenn ja, wie soll ich damit umgehen?

    
dreta 07.01.2012, 10:26
quelle

1 Antwort

21

Das Objekt, das Sie löschen, wird nicht geleert, sein Speicherblock wird freigegeben.

Wenn Sie den Destruktor in base_class nicht als virtuell deklariert haben, leugnet alle dynamisch zugewiesenen Objekte in derived_class , die darauf angewiesen sind, dass der Destruktor von derived_class frei ist Sie. Wenn der Destruktor nicht virtuell ist, wird in diesem Fall der derived_class -Destruktor nicht aufgerufen. Es bedeutet auch, dass Destruktoren von "eingebetteten Objekten" innerhalb von derived_class nicht automatisch aufgerufen werden, ein separates, aber zusätzliches Problem, das zu weiteren Lecks und der Nichtausführung von vitalem Cleanup-Code führen kann.

Kurz gesagt, deklarieren Sie den Destruktor in base_class als virtuell, und Sie können die Technik, die Sie vorgestellt haben, sicher verwenden.

Für ein Codebeispiel siehe:

In welcher Art der Situation, C ++ Destruktor wird nicht aufgerufen?

    
ScrollerBlaster 07.01.2012, 10:39
quelle

Tags und Links