2016-11-16 4 views
0

Nehmen wir an, ich habe eine Basisklasse X mit nur einer virtuellen Funktion.Virtueller Destruktor - wenn es notwendig ist

Ich erweitere es zu Y und überschreibe diese Funktion.

ich nicht bot expliziten destructor für X und Y.

Was während der Zerstörung in dieser Aussage geschieht.

Y y; 
X *x= &y; 
return; 
. 
. 
. 
X*x = new Y; 
delete x; 
return; 

Welche Speicherleck verursachen ..

+0

Weder? Ich sehe auch nicht, wie diese beiden Codeschnipsel allein mit virtuellen Destruktoren zusammenhängen? Sie müssten mindestens die Klassendefinitionen anzeigen. – UnholySheep

+0

1) Kein Problem. x ist nur ein Zeiger, aber y wird zerstört und befreit alle Ressourcen von der Superklasse. 2) Ressourcen von Y gehen verloren, weil nur der Destruktor von X für eine Instanz von Y im Speicher aufgerufen wird -> möglicher Speicherleck (oder schlechter). – Youka

+0

@ UnholySheep gibt es nichts Besonderes über die Klassendefinition. Ich habe die Aussage erwähnt. Der zweite scheint ein Speicherleck zu verursachen –

Antwort

0
Y y; 
X *x = &y; 
return; 

schlecht Nichts geschieht hier. Das Objekt y wird am Ende seines Anwendungsbereichs (vollständig) zerstört.

X*x = new Y; 
delete x; 
return; 

Dies bewirkt, dass ein Speicher auslaufen, wenn Sie Glück sind. Das Verhalten ist undefiniert, was bedeutet, dass etwas Schlimmes passieren kann.

Es ist im Allgemeinen eine gute Idee, einen virtuellen Destruktor immer dann zu deklarieren, wenn die Klasse eine Basisklasse für andere Klassen sein soll.

Verwandte Themen