Zeiger auf Klasse wird nicht korrekt gelöscht
-
Nabend, folgende Problemstellung
class B { B(double wert){}//implementation lasse ich aus übersicht weg ~B() { delete this; //kann man das so einfach machen?? } };#include "B.h" //Vererbung zieht hier nicht, da B nicht in der "ist ein" Beziehung zu A steht. class A { public: B *meinB; A() { meinB = new B(1000); } };Soo,heißt also wenn ein A erstellt wird,wird automatisch auch ein B erzeugt.Wenn ich jetzt das erstellen und löschen der Objekte mitlogge wird B niemals korrekt abgeräumt? Wo hab ich da ein Denkfehler drinne?
-
Du kannst das Objekt nicht von sich selber aus zerstören. Das wäre, als ob es tot wäre, bevor es sterben würde. Im Destruktor werden nämlich noch die automatischen Stackvariablen zerstört. Wenn du jetzt schon das Objekt vorher manuell destruierst, kann das zu undefiniertem Verhalten führen.
Vom Design her muss es so sein, dass der Aufrufer, der mit
newanfordert, auch wieder für dasdeletezuständig ist. In diesem Falle kann man diese Aufgabe nicht der Instanz selber abgeben. Was aber gehen würde, wären Smartpointer.
-
Hallo,
soweit ich weiss ist es "illegal" delete this aufzurufen.
Wenn du delete auf ein Objekt anwendest wird sein destruktor aufgerufen, der wiederum delete aufruft => EndlosschliefeGruss
CrimsonKing
-
CrimsonKing schrieb:
Wenn du delete auf ein Objekt anwendest wird sein destruktor aufgerufen, der wiederum delete aufruft => Endlosschliefe
Das muss nicht einmal sein, da das Objekt nach
delete this;gar nicht mehr existiert -> der Destruktor funktioniert möglicherweise gar nicht mehr.Aber eben: Von solchen Sachen absehen. Besser, man lässt auch die Finger von manuellen Destruktoraufrufen.