<?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[[gelöst] delete Zeiger auf Mutter-Klasse]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich baue gerade eine std::list mit verschiedenen Kindern auf. Folgendes:</p>
<pre><code class="language-cpp">class A { int zahl; };
class B : public A { int nochnezahl; };
class C : public A { int anderezahl; };

typedef std::list&lt;A*&gt; MyListe;

A* a = new A();
a-&gt;zahl=1;

B* b = new B();
b-&gt;zahl=2;
b-&gt;nochnezahl=3;

C* c = new C();
c-&gt;zahl=3;
c-&gt;anderezahl=4;

MyListe L;
L.push_back(a);
L.push_back(b);
L.push_back(c);

MyListe::iterator it;
for (it=L.begin(); it!=L.end(); L++)
{
  cout &lt;&lt; *it-&gt;zahl; // Geht und findet die richtigen Zahlen.
}

for (it=L.begin()); it!=L.end(); L++)
{
  delete *it; // Speicher-Leaks bei B* und C*
}
L.clear();
</code></pre>
<p>Im groben mache ich genau das. Jetzt ist mir aufgefallen, dass ich Memory-Leaks bekomme. Und zwar bei, delete der Zeiger auf das B*- und C*-Element. Anscheinend kann man kein &quot;delete A*&quot; für ein Element von &quot;B*&quot; ausführen, weil dann nur die &quot;A*&quot;-Bereiche freigegeben werden. Der Rest bleibt wohl im Speicher liegen und ergibt das Leak.</p>
<p>Kann man das irgendwie trotzdem lösen?<br />
Ich hab im Internet etwas gestöbert und etwas von auto_ptr gelesen, aber gleichzeitig viele Seiten gefunden, die davon abraten einen auto_prt in eine std::list zu legen. Außerdem finde ich gerade keinen Ansatz um den auto_prt irgendwie auf meine 3 Klassen passen zu schreiben.<br />
auto_prt die Lösung oder ein falscher Ansatz?</p>
<p>Frage: Wie kann ich in einem Listendurchlauf meine Pointer per delete löschen, ohne das etwas im Speicher zurück bleibt.</p>
<p>Danke,<br />
Stefan</p>
<p>PS: Ich brauche die Strukturen, weil in der Klasse A eine virtuelle Funktion (für die Ausgabe) liegt, die in B und C virtuell überschrieben werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/276812/gelöst-delete-zeiger-auf-mutter-klasse</link><generator>RSS for Node</generator><lastBuildDate>Wed, 26 Aug 2026 05:29:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/276812.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 08 Nov 2010 16:46:58 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [gelöst] delete Zeiger auf Mutter-Klasse on Mon, 08 Nov 2010 16:56:48 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich baue gerade eine std::list mit verschiedenen Kindern auf. Folgendes:</p>
<pre><code class="language-cpp">class A { int zahl; };
class B : public A { int nochnezahl; };
class C : public A { int anderezahl; };

typedef std::list&lt;A*&gt; MyListe;

A* a = new A();
a-&gt;zahl=1;

B* b = new B();
b-&gt;zahl=2;
b-&gt;nochnezahl=3;

C* c = new C();
c-&gt;zahl=3;
c-&gt;anderezahl=4;

MyListe L;
L.push_back(a);
L.push_back(b);
L.push_back(c);

MyListe::iterator it;
for (it=L.begin(); it!=L.end(); L++)
{
  cout &lt;&lt; *it-&gt;zahl; // Geht und findet die richtigen Zahlen.
}

for (it=L.begin()); it!=L.end(); L++)
{
  delete *it; // Speicher-Leaks bei B* und C*
}
L.clear();
</code></pre>
<p>Im groben mache ich genau das. Jetzt ist mir aufgefallen, dass ich Memory-Leaks bekomme. Und zwar bei, delete der Zeiger auf das B*- und C*-Element. Anscheinend kann man kein &quot;delete A*&quot; für ein Element von &quot;B*&quot; ausführen, weil dann nur die &quot;A*&quot;-Bereiche freigegeben werden. Der Rest bleibt wohl im Speicher liegen und ergibt das Leak.</p>
<p>Kann man das irgendwie trotzdem lösen?<br />
Ich hab im Internet etwas gestöbert und etwas von auto_ptr gelesen, aber gleichzeitig viele Seiten gefunden, die davon abraten einen auto_prt in eine std::list zu legen. Außerdem finde ich gerade keinen Ansatz um den auto_prt irgendwie auf meine 3 Klassen passen zu schreiben.<br />
auto_prt die Lösung oder ein falscher Ansatz?</p>
<p>Frage: Wie kann ich in einem Listendurchlauf meine Pointer per delete löschen, ohne das etwas im Speicher zurück bleibt.</p>
<p>Danke,<br />
Stefan</p>
<p>PS: Ich brauche die Strukturen, weil in der Klasse A eine virtuelle Funktion (für die Ausgabe) liegt, die in B und C virtuell überschrieben werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1977409</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1977409</guid><dc:creator><![CDATA[stefanjann]]></dc:creator><pubDate>Mon, 08 Nov 2010 16:56:48 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] delete Zeiger auf Mutter-Klasse on Mon, 08 Nov 2010 16:49:04 GMT]]></title><description><![CDATA[<p>Ist der Destruktor von A virtuell?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1977411</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1977411</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Mon, 08 Nov 2010 16:49:04 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] delete Zeiger auf Mutter-Klasse on Mon, 08 Nov 2010 16:50:28 GMT]]></title><description><![CDATA[<p>Du brauchst einen virtuellen Destruktor in der Mutterklasse ( <code>virtual ~A(){}</code> )!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1977413</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1977413</guid><dc:creator><![CDATA[Oberon_0]]></dc:creator><pubDate>Mon, 08 Nov 2010 16:50:28 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] delete Zeiger auf Mutter-Klasse on Mon, 08 Nov 2010 16:56:24 GMT]]></title><description><![CDATA[<p>Hallo und Danke,</p>
<p>da ich intern &quot;nur&quot; mit einfachen Variablen gearbeitet habe hatte ich gar keinen d'tor.</p>
<pre><code class="language-cpp">virtual ~A() {}
</code></pre>
<p>war die Lösung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1977414</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1977414</guid><dc:creator><![CDATA[stefanjann]]></dc:creator><pubDate>Mon, 08 Nov 2010 16:56:24 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] delete Zeiger auf Mutter-Klasse on Mon, 08 Nov 2010 17:01:54 GMT]]></title><description><![CDATA[<p>rule of thumb:<br />
Wenn die Klasse eine virtuelle Funktion hat dann sollte mit großer Wahrscheinlichkeit der Destruktor auch virtuell werden.</p>
<p>Immer im Hinterkopf behalten <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>(Bedenke: wenn du eh schon eine virtuelle Funktion hast, kannst du ruhig immer den Dtor auch virtuell setzen - denn es kostet quasi garnichts).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1977417</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1977417</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Mon, 08 Nov 2010 17:01:54 GMT</pubDate></item></channel></rss>