<?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[Problem mit Löschen von Vektor-Elementen]]></title><description><![CDATA[<p>Ich habe einen STL-Vektor, der mit verschiedenen Zeigern auf polymorphe Objekten gefüllt ist (also Instanzen verschiedener Klassen mit alle derselben Basisklasse). Wenn ich clear() aufrufe, dann sollen angeblich die Destruktoren der Elemente aufgerufen werden, bevor sie aus dem Vektor entfernt werden. Der Destruktor der Basisklasse ist außerdem virtual, also sollte auch immer der abgeleitete Destruktor mit aufgerufen werden. Trotzdem passiert das nicht, es wird weder der abgeleitete, noch der Basis-Destruktor aufgerufen. Erst wenn ich eine Schleife schreibe, die jedes Element manuell per delete löscht, werden auch die Destruktoren aufgerufen.</p>
<p>Woran liegt denn das?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/213915/problem-mit-löschen-von-vektor-elementen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 13 Oct 2026 20:51:51 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/213915.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 23 May 2008 11:49:22 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit Löschen von Vektor-Elementen on Fri, 23 May 2008 11:49:22 GMT]]></title><description><![CDATA[<p>Ich habe einen STL-Vektor, der mit verschiedenen Zeigern auf polymorphe Objekten gefüllt ist (also Instanzen verschiedener Klassen mit alle derselben Basisklasse). Wenn ich clear() aufrufe, dann sollen angeblich die Destruktoren der Elemente aufgerufen werden, bevor sie aus dem Vektor entfernt werden. Der Destruktor der Basisklasse ist außerdem virtual, also sollte auch immer der abgeleitete Destruktor mit aufgerufen werden. Trotzdem passiert das nicht, es wird weder der abgeleitete, noch der Basis-Destruktor aufgerufen. Erst wenn ich eine Schleife schreibe, die jedes Element manuell per delete löscht, werden auch die Destruktoren aufgerufen.</p>
<p>Woran liegt denn das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1515074</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1515074</guid><dc:creator><![CDATA[David Schneider]]></dc:creator><pubDate>Fri, 23 May 2008 11:49:22 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Löschen von Vektor-Elementen on Fri, 23 May 2008 11:51:45 GMT]]></title><description><![CDATA[<p>Es wird nicht der Destruktor der Elemente aufgerufen. Das musst du schon durch eine Schlaufe und delte/delete[] selber machen.<br />
-&gt; Merke: Alles, was DU an Speicher anforderts, musst auch DU wieder freigeben. Das heisst für jedes new soll es auch ein delete in DEINEM Code geben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1515080</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1515080</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Fri, 23 May 2008 11:51:45 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Löschen von Vektor-Elementen on Fri, 23 May 2008 11:54:31 GMT]]></title><description><![CDATA[<p>Wenn in Deinem vector Objekte wären, würden auch die Destruktoren aufgerufen werden. Es sind aber Zeiger drin. Objekte, die durch Zeiger referenziert werden, musst Du explizit mit delete zerstören.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1515082</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1515082</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 23 May 2008 11:54:31 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Löschen von Vektor-Elementen on Fri, 23 May 2008 14:42:45 GMT]]></title><description><![CDATA[<p>David Schneider schrieb:</p>
<blockquote>
<p>Wenn ich clear() aufrufe, dann sollen angeblich die Destruktoren der Elemente aufgerufen werden, bevor sie aus dem Vektor entfernt werden.</p>
</blockquote>
<p>Das wird auch getan, nur verwendest du Zeiger als Element, und die Zeiger (nicht die Elemente auf die gezeigt wird) werden aufgeräumt. Das ist auch ziemlich logisch, da es dem normalen C++ verhalten entspricht:</p>
<pre><code class="language-cpp">int main()
{
  {
    int a = 4;
  } // &lt;-- hier wird a destruiert
  {
    int * a = new int(4);
  } // &lt;-- hier wird a destruiert, nicht aber dass, auf das gezeigt wird!
}
</code></pre>
<p>Grundsätzlich gilt sonst das von drakon geschriebene, oder du verwendest Smartpointer (die sich beim Destruieren auch um die Speicherfreigabe kümmern)</p>
<p>Dies könnte z.B. wie folgt aussehen:</p>
<pre><code class="language-cpp">// statt
std::vector&lt;BaseClass*&gt; basePtrList;
// nehmen wir eines der folgenden (erfordert boost oder tr1)
std::vector&lt;std::tr1::shared_ptr&lt;BaseClass&gt; &gt; tr1SmartPtrList;
std::vector&lt;boost::shared_ptr&lt;BaseClass&gt; &gt; boostSmartPtrList;
</code></pre>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1515098</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1515098</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Fri, 23 May 2008 14:42:45 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Löschen von Vektor-Elementen on Fri, 23 May 2008 12:18:21 GMT]]></title><description><![CDATA[<p>Ja, richtig. Wie dumm von mir...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1515111</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1515111</guid><dc:creator><![CDATA[David Schneider]]></dc:creator><pubDate>Fri, 23 May 2008 12:18:21 GMT</pubDate></item></channel></rss>