Anfängerfragen zum löschen von Objektreferenzen im Destruktor
-
Hallo,
beruflich von C# kommend lerne ich gerade privat C++. In C++ bin ich absoluter Anfänger. Als IDE und Compiler verwende ich das VS 2012.
Im moment habe ich Verständnisschwierigkeiten was die Objektreferenz via Zeiger betrifft.
Zunächst einmal der vereinfachte Konstruktor und Destruktor meiner Testklasse:
Control::Control(Control *parent) : m_width(100), m_height(25), m_top(0), m_left(0), m_isDirty(true) { m_pParent = parent; } Control::~Control(void) { m_pParent = NULL; }Meiner Basisklasse Control möchte ich im Konstruktor eine Referenz auf das jeweilige Parent-Control übergeben und dies für Lebenszeit von Control in m_pParent als Referenz speichern, da ich diese in einigen Methoden benötige.
m_pParent habe ich im Header wie folgt definiert:
protected: // Zeiger auf das Parent-Control Control *m_pParent;Ich habe hier Protected gewählt damit das Feld auch den später ableitenden Klassen verfügbar gemacht wird.
Nun war mein Verständnis so, dass ich beim zerstören des Control-Objektes den Zeiger auf das Parent-Control auf NULL setzen muss, weil ja sonst eine Referenz auf das Parent-Objekt quasi "hängen" bleiben würde.
Denn wenn ich das Parent Control mit new anlege und mit delete lösche sollte das delete ja fehlschlagen solange da noch ein Zeiger drauf zeigt (zumindest mein Verständnis bislang).
Dem scheint aber nicht so zu sein, wenn ich den Zeiger nicht auf NULL setze, zumindest zeigt mir
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );keine Speicherlecks an wenn ich das NULL-setzen im Destruktor weglasse.
Das verwirrt mich jetzt, denn ich dachte das gerade durch solche Vorgänge Speicherlecks entstehen würden.
Und was mich auch interessieren würde: habe ich die Übergabe als Referenz auf das Parent-Control so überhaupt richtig gemacht (ich möchte keine Kopie des Parent-Controls sondern eine Referenz)?
Da Control eine Basisklasse ist habe ich den Destruktor als virtual gekennzeichnet, wird der denn auch dann aufgerufen wenn ich von dieser Klasse erbe (z.B. in einer Klasse ControlButton)?
Mir wurde hier im Forum bereits erklärt das es modernere Techniken wie SmartPointer gibt, aber es geht mir hier erstmal nur um das grundlegende Verständnis von C++.
Vielen Dank für alle Antworten im voraus,
Matze
-
Ein Pointer zeigt auf eine andere Variable.
Wird der Pointer ungültig existiert er nicht mehr, die Variable aber schon noch.
Solange die Variable auf dem Stack liegt und ebenfalls automatisch zerstört wird, ist das nciht schlimm.
Wird aber mit new Speicher vom Heap angefordert, muss der auch gelöscht werden. Existiert der Pointer nicht mehr, kann man den Speicher nicht mehr löschen. Deswegen nur ein delete im Destruktor, wenn mit new Speicher angefordert wurde.
Auf NULL/nullptr setzen ist deswegen überflüssig.
-
Vielen Dank nathan.