<?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[Memory Leaks - Verständnisfrage]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich hab einmal eine kleine Verständnisfrage zum Thema &quot;Dynamische Speicherverwaltung mit 'new' und 'delete'&quot;:<br />
Wenn wir uns einmal vorstellen, wir hätten eine Basisklasse (Wirbeltiere) und eine abgeleitete Klasse (Hund). Jetzt schreibe ich folgenden Code:</p>
<pre><code class="language-cpp">Wirbeltiere* TierZeiger = new Hund();
TierZeiger-&gt;SetArt(&quot;Goldenretriever&quot;);
TierZeiger-&gt;SetAlter(2);
TierZeiger-&gt;KontruiereTier();
delete TierZeiger;
</code></pre>
<p><strong>Aber was passiert genau im Speicher?</strong> Soweit ich das verstanden habe, wird mit <em>Wirbeltiere</em> TierZeiger = new Hund()* Speicher auf dem Stack für den Zeiger <em>TierZeiger</em> und Speicher auf dem Heap für *<em>TierZeiger</em> reserviert. Nach dem Programmende wird der Destruktor von <em>TierZeiger</em> aufgerufen und damit eliminiert, jedoch nicht der Teil des Zeigers auf dem Heap. Ich muss also dementsprechend auch <em>delete TierZeiger</em> im Code aufführen. <strong>Doch was passiert real im Computer wenn ich es nicht tue?</strong><br />
<strong>Und was ist nach dem Programmende mit der Speicheradresse? Ist diese immernoch &quot;kaputt&quot;, oder nur zur Laufzeit?</strong></p>
<p>MFG</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/297913/memory-leaks-verständnisfrage</link><generator>RSS for Node</generator><lastBuildDate>Fri, 14 Aug 2026 04:21:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/297913.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 09 Jan 2012 15:00:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Memory Leaks - Verständnisfrage on Mon, 09 Jan 2012 15:02:42 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich hab einmal eine kleine Verständnisfrage zum Thema &quot;Dynamische Speicherverwaltung mit 'new' und 'delete'&quot;:<br />
Wenn wir uns einmal vorstellen, wir hätten eine Basisklasse (Wirbeltiere) und eine abgeleitete Klasse (Hund). Jetzt schreibe ich folgenden Code:</p>
<pre><code class="language-cpp">Wirbeltiere* TierZeiger = new Hund();
TierZeiger-&gt;SetArt(&quot;Goldenretriever&quot;);
TierZeiger-&gt;SetAlter(2);
TierZeiger-&gt;KontruiereTier();
delete TierZeiger;
</code></pre>
<p><strong>Aber was passiert genau im Speicher?</strong> Soweit ich das verstanden habe, wird mit <em>Wirbeltiere</em> TierZeiger = new Hund()* Speicher auf dem Stack für den Zeiger <em>TierZeiger</em> und Speicher auf dem Heap für *<em>TierZeiger</em> reserviert. Nach dem Programmende wird der Destruktor von <em>TierZeiger</em> aufgerufen und damit eliminiert, jedoch nicht der Teil des Zeigers auf dem Heap. Ich muss also dementsprechend auch <em>delete TierZeiger</em> im Code aufführen. <strong>Doch was passiert real im Computer wenn ich es nicht tue?</strong><br />
<strong>Und was ist nach dem Programmende mit der Speicheradresse? Ist diese immernoch &quot;kaputt&quot;, oder nur zur Laufzeit?</strong></p>
<p>MFG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2165825</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2165825</guid><dc:creator><![CDATA[klucki9]]></dc:creator><pubDate>Mon, 09 Jan 2012 15:02:42 GMT</pubDate></item><item><title><![CDATA[Reply to Memory Leaks - Verständnisfrage on Mon, 09 Jan 2012 15:14:09 GMT]]></title><description><![CDATA[<p>Kommt drauf an, wie die Klasse <code>Wirbeltiere</code> implementiert ist und ob sie einen virtuellen Destruktor hat.<br />
Mit virtuellem Destruktor wird automatisch der eigene und der Destruktor der abgeleiteten Klasse aufgerufen, damit wird der Speicher ordnungsgemäß freigegeben (zuerst der Destruktor des abgeleiteten Klassen, anschließend der Destruktor der Basisklasse).<br />
Ohne virtuellen Destruktor in der Basisklasse wird nur der Destruktor der Basisklasse aufgerufen, was zu Speicherlecks führen kann, aber nicht muss.</p>
<p>Edit:<br />
Zumindest gibt nach Prozessende sämtlichen vom Prozess benutzten Speicher und Systemresourcen wieder frei, du klaust dem System also kein RAM nach Prozessende.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2165836</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2165836</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Mon, 09 Jan 2012 15:14:09 GMT</pubDate></item><item><title><![CDATA[Reply to Memory Leaks - Verständnisfrage on Mon, 09 Jan 2012 15:16:33 GMT]]></title><description><![CDATA[<p>DocShoe schrieb:</p>
<blockquote>
<p>Kommt drauf an, wie die Klasse <code>Wirbeltiere</code> implementiert ist und ob sie einen virtuellen Destruktor hat.<br />
Mit virtuellem Destruktor wird automatisch der eigene und der Destruktor der abgeleiteten Klasse aufgerufen, damit wird der Speicher ordnungsgemäß freigegeben (zuerst der Destruktor des abgeleiteten Klassen, anschließend der Destruktor der Basisklasse).<br />
Ohne virtuellen Destruktor in der Basisklasse wird nur der Destruktor der Basisklasse aufgerufen, was zu Speicherlecks führen kann, aber nicht muss.</p>
</blockquote>
<p>D.h. am besten angewöhnen immer einen virtuellen Destruktor in der Baseclass zu programmieren?</p>
<p>Edit:</p>
<p>Okay, also wird das Speicherloch nach dem Programmende (Prozessende) gleich gestopft?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2165837</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2165837</guid><dc:creator><![CDATA[klucki9]]></dc:creator><pubDate>Mon, 09 Jan 2012 15:16:33 GMT</pubDate></item><item><title><![CDATA[Reply to Memory Leaks - Verständnisfrage on Mon, 09 Jan 2012 15:16:25 GMT]]></title><description><![CDATA[<p>Was real passiert, kann man nicht sagen. Da es dem Betriebbsystem oder auch der C++ Runtime überlassen wird. Aber meistens ist es so, das in einer Art Tabelle sich gemerkt wird, wer wo Speicher reserviert/angefordert hat. Und wenn etwas gelöscht wird, wird sich nur in der Tabelle ein Vermerk gemacht bzw. der Eintrag aus der Tabelle genommen.</p>
<p>Aber der Speicher selbst, der reserviert war, wird nicht &quot;resettet&quot;. D.h. du kannst &quot;Goldenretriever&quot; noch im Speicher finden, wenn du einen Speichermonitor bemühst.</p>
<p>Das ist wie bei der Festplatte: du löschst eine Datei, aber es verschwindet in Wirklichkeit nur der Verzeichniseintrag. Den Inhal der ehemaligen Datei kannst du noch finden.</p>
<p>Es ist eine Performancefrage.</p>
<p>Wenn es z.B. um geheime Daten gehen würde, wäre es klüger nicht nur den Eintrag aus der Verwaltung zu nehmen, sondern auch die eigentlichen Daten mit unsinnigen Daten zu überschreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2165841</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2165841</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Mon, 09 Jan 2012 15:16:25 GMT</pubDate></item></channel></rss>