<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Anfängerfragen zum löschen von Objektreferenzen im Destruktor]]></title><description><![CDATA[<p>Hallo,</p>
<p>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.</p>
<p>Im moment habe ich Verständnisschwierigkeiten was die Objektreferenz via Zeiger betrifft.</p>
<p>Zunächst einmal der vereinfachte Konstruktor und Destruktor meiner Testklasse:</p>
<pre><code>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;
}
</code></pre>
<p>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.</p>
<p>m_pParent habe ich im Header wie folgt definiert:</p>
<pre><code>protected:
	// Zeiger auf das Parent-Control
	Control *m_pParent;
</code></pre>
<p>Ich habe hier <em>Protected</em> gewählt damit das Feld auch den später ableitenden Klassen verfügbar gemacht wird.</p>
<p>Nun war mein Verständnis so, dass ich beim zerstören des Control-Objektes den Zeiger auf das Parent-Control auf <em>NULL</em> setzen muss, weil ja sonst eine Referenz auf das Parent-Objekt quasi &quot;hängen&quot; bleiben würde.</p>
<p>Denn wenn ich das Parent Control mit <em>new</em> anlege und mit <em>delete</em> lösche sollte das <em>delete</em> ja fehlschlagen solange da noch ein Zeiger drauf zeigt (zumindest mein Verständnis bislang).</p>
<p>Dem scheint aber nicht so zu sein, wenn ich den Zeiger nicht auf <em>NULL</em> setze, zumindest zeigt mir</p>
<pre><code>_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
</code></pre>
<p>keine Speicherlecks an wenn ich das <em>NULL</em>-setzen im Destruktor weglasse.</p>
<p>Das verwirrt mich jetzt, denn ich dachte das gerade durch solche Vorgänge Speicherlecks entstehen würden.</p>
<p>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)?</p>
<p>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)?</p>
<p><em>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++.</em></p>
<p>Vielen Dank für alle Antworten im voraus,<br />
Matze</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/314718/anfängerfragen-zum-löschen-von-objektreferenzen-im-destruktor</link><generator>RSS for Node</generator><lastBuildDate>Sat, 01 Aug 2026 00:31:08 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/314718.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 11 Mar 2013 20:28:02 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Anfängerfragen zum löschen von Objektreferenzen im Destruktor on Mon, 11 Mar 2013 20:28:02 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>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.</p>
<p>Im moment habe ich Verständnisschwierigkeiten was die Objektreferenz via Zeiger betrifft.</p>
<p>Zunächst einmal der vereinfachte Konstruktor und Destruktor meiner Testklasse:</p>
<pre><code>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;
}
</code></pre>
<p>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.</p>
<p>m_pParent habe ich im Header wie folgt definiert:</p>
<pre><code>protected:
	// Zeiger auf das Parent-Control
	Control *m_pParent;
</code></pre>
<p>Ich habe hier <em>Protected</em> gewählt damit das Feld auch den später ableitenden Klassen verfügbar gemacht wird.</p>
<p>Nun war mein Verständnis so, dass ich beim zerstören des Control-Objektes den Zeiger auf das Parent-Control auf <em>NULL</em> setzen muss, weil ja sonst eine Referenz auf das Parent-Objekt quasi &quot;hängen&quot; bleiben würde.</p>
<p>Denn wenn ich das Parent Control mit <em>new</em> anlege und mit <em>delete</em> lösche sollte das <em>delete</em> ja fehlschlagen solange da noch ein Zeiger drauf zeigt (zumindest mein Verständnis bislang).</p>
<p>Dem scheint aber nicht so zu sein, wenn ich den Zeiger nicht auf <em>NULL</em> setze, zumindest zeigt mir</p>
<pre><code>_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
</code></pre>
<p>keine Speicherlecks an wenn ich das <em>NULL</em>-setzen im Destruktor weglasse.</p>
<p>Das verwirrt mich jetzt, denn ich dachte das gerade durch solche Vorgänge Speicherlecks entstehen würden.</p>
<p>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)?</p>
<p>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)?</p>
<p><em>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++.</em></p>
<p>Vielen Dank für alle Antworten im voraus,<br />
Matze</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2305919</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2305919</guid><dc:creator><![CDATA[Matze1974]]></dc:creator><pubDate>Mon, 11 Mar 2013 20:28:02 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerfragen zum löschen von Objektreferenzen im Destruktor on Mon, 11 Mar 2013 20:47:10 GMT]]></title><description><![CDATA[<p>Ein Pointer zeigt auf eine andere Variable.<br />
Wird der Pointer ungültig existiert er nicht mehr, die Variable aber schon noch.<br />
Solange die Variable auf dem Stack liegt und ebenfalls automatisch zerstört wird, ist das nciht schlimm.<br />
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.<br />
Auf NULL/nullptr setzen ist deswegen überflüssig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2305923</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2305923</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Mon, 11 Mar 2013 20:47:10 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerfragen zum löschen von Objektreferenzen im Destruktor on Mon, 11 Mar 2013 21:51:10 GMT]]></title><description><![CDATA[<p>Vielen Dank nathan.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2305950</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2305950</guid><dc:creator><![CDATA[Matze1974]]></dc:creator><pubDate>Mon, 11 Mar 2013 21:51:10 GMT</pubDate></item></channel></rss>