Konstruktor / Dekonstruktor
-
Hallo,
vielleicht kann mir jemand auf die Sprünge helfen bei einem Problem:
Wenn ich den Konstruktor einer Klasse auf rufe (im Konstruktor einer anderen),
wird sofort danach der Dekonstruktor auf gerufen, d.H das Objekt
wieder gelöscht.Class A{
A(int, int);
~A();
}Class B{
A *a_ptr;B();
~B();
}B::B(){
a_ptr = new A(1,2);
}Wenn ich dann im Programmverlauf so etwas wie a_ptr->func() machen möchte
zeigt der Zeiger ins nichts. Im Debugger zeigt sich dann, dass das Objekt
sofort nach Erstellung gelöscht wird. Was mich wundert, ist dass gar nicht
erst zurrückgesprungen wird (da die aufrufende Funktion/Klasse ja ihre
daseinsberechtigung verlieren könnte und deshalb alles gelöscht wird), nein,
der Dekunstruktor wird dirket nach dem Konstruktor aufgerufen.Ich habe den Verdacht, dass ich da in einer klassischen Anfängerfalle tappe,
danke schon mal
Lg
Binary
-
Zeig doch mal bitte deinen kompletten Code - aus dem Schnipselchen kann man nicht wirklich etwas diagnostizieren. (vor allem: Wo und wie wird dein B-Objekt angelegt?)
PS: [cpp]-Tags sind eine nützliche Erfindung

-
Hi!
Ich konnte mein Problem lösen, a_ptr wurde verwendet obwohl aus einer statischen Funktion nicht sichtbar war.
Es wird jetzt auch nicht mehr sofort der Dekonstruktor auf gerufen, aber der einzige Unterschied zu Vorher ist jetzt, dass das Objekt "benutzt" wird. (B
Gibt es in C++ etwa so was wie den GarbagCollector in Java, der unreferenzierte Objekte löscht??So noch mal mit tags:

Class A{ A(int, int); // Class A Konstruktor /Dekonstruktor. ~A(); } // [...] Implementierung von A. Class B{ A *a_ptr; // deklaration eines Zeigers auf ein Objekt A B(); // Class B Konstruktor /Dekonstruktor ~B(); } B::B(){ // Implementierung des B-Konstruktors a_ptr = new A(1,2); // Initialisierung von a_ptr } // [...] estlich Implementierung von B. main(){ B objB = new B(); runMainLoop(); }Das B-Objekt ist während der gesamten Laufzeit gültig.
Lg
Binary
-
nein! es gibt keinen garbage collector. deshalb musst du dich um die freigabe des speichers SELBER kümmern!
deshalb sollte der B-destruktor so aussehen:B::~B() { delete a_ptr; }sonst speicherleiche...
-
Binarys schrieb:
Gibt es in C++ etwa so was wie den GarbagCollector in Java, der unreferenzierte Objekte löscht??
Nicht direkt, aber Smart Pointer kommen dem schon recht nahe, du musst nur selber auf zyklische Referenzen aufpassen.
Und es macht sich immer besser den Originalcode (natürlich auf's relevante gekürzt!) ins Forum zu stellen...