<?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[Probleme mit vector]]></title><description><![CDATA[<p>Hallo zusammen... ich lege in einem Vector Pointer auf Objekte ab, die ich mit new erzeuge</p>
<pre><code class="language-cpp">CKlasse* pTest = new CKlasse();
m_Vector-&gt;insert(m_Vector-&gt;end(), pTest);
</code></pre>
<p>Nun arbeite ich ein bischen und wenn ich nun die erzeugten Objekte wieder freigeben möchte mit</p>
<pre><code class="language-cpp">CKlasse* pElement;

while(pVector-&gt;size() &gt; 0) {
  pElement = pVector-&gt;back();
  pVector-&gt;pop_back();
  delete pElement;
}

pVector-&gt;clear();
</code></pre>
<p>Bekomme ich schon beim ersten Aufruf von delete den folgenden Fehler:</p>
<p>HEAP[Test.exe]: Invalid Address specified to RtlValidateHeap( 00350000, 00D8774C )</p>
<p>Wieso?!</p>
<p>Ich benutze Microsoft Visual Studio 2005... und die STL die dort integriert ist <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Danke für Antworten!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/172875/probleme-mit-vector</link><generator>RSS for Node</generator><lastBuildDate>Fri, 18 Sep 2026 01:51:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/172875.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 09 Feb 2007 09:35:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Probleme mit vector on Fri, 09 Feb 2007 09:35:29 GMT]]></title><description><![CDATA[<p>Hallo zusammen... ich lege in einem Vector Pointer auf Objekte ab, die ich mit new erzeuge</p>
<pre><code class="language-cpp">CKlasse* pTest = new CKlasse();
m_Vector-&gt;insert(m_Vector-&gt;end(), pTest);
</code></pre>
<p>Nun arbeite ich ein bischen und wenn ich nun die erzeugten Objekte wieder freigeben möchte mit</p>
<pre><code class="language-cpp">CKlasse* pElement;

while(pVector-&gt;size() &gt; 0) {
  pElement = pVector-&gt;back();
  pVector-&gt;pop_back();
  delete pElement;
}

pVector-&gt;clear();
</code></pre>
<p>Bekomme ich schon beim ersten Aufruf von delete den folgenden Fehler:</p>
<p>HEAP[Test.exe]: Invalid Address specified to RtlValidateHeap( 00350000, 00D8774C )</p>
<p>Wieso?!</p>
<p>Ich benutze Microsoft Visual Studio 2005... und die STL die dort integriert ist <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Danke für Antworten!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1225518</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1225518</guid><dc:creator><![CDATA[Meyer123]]></dc:creator><pubDate>Fri, 09 Feb 2007 09:35:29 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit vector on Fri, 09 Feb 2007 09:40:33 GMT]]></title><description><![CDATA[<p>Ist es unbedingt nötig, deine Objekte mit new anzulegen? Du kannst dir die Arbeit deutlich vereinfachen, indem du die Objekte direkt in den vector&lt;&gt; packst (anstatt Pointer zu verwenden).</p>
<p>Ansonsten: Der Fehler sieht danach aus, als ob du entweder deinen Heap demoliert (durch Bereichsüberschreitungen o.ä.) oder eins der vector-Elemente schon vor dieser Aufräumschleife freigegeben hast. Aus deinem Code-Schnipsel kann man leider nicht erkennen, wo der Fehler liegt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1225524</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1225524</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 09 Feb 2007 09:40:33 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit vector on Fri, 09 Feb 2007 09:45:58 GMT]]></title><description><![CDATA[<p>Also wenn der Heap doch defekt wäre würden doch Zeiger irgendwo hinzeigen die es nicht gibt oder?</p>
<p>Also wenn ich das delete weglasse und eine Ausgabe aufrufe der Art:</p>
<pre><code class="language-cpp">CKlasse* pElement;

while(pVector-&gt;size() &gt; 0) {
  pElement = pVector-&gt;back();
  pVector-&gt;pop_back();
  TRACE(&quot;%s\n&quot;, pElement-&gt;Name());
}

pVector-&gt;clear();
</code></pre>
<p>Bekomme ich die wunderbare Ausgabe aller Namen... und zwar von jedem Objekt das ich angelegt habe.</p>
<p>Wenn ich keine Zeiger verwende sondern direkt die Objekte in meinen vector aufnehme... dann die Funktion verlasse werden die Objekte doch zerstört oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1225527</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1225527</guid><dc:creator><![CDATA[Meyer123]]></dc:creator><pubDate>Fri, 09 Feb 2007 09:45:58 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit vector on Fri, 09 Feb 2007 09:50:37 GMT]]></title><description><![CDATA[<p>Also wenn der Heap doch defekt wäre würden doch Zeiger irgendwo hinzeigen die es nicht gibt oder?</p>
<p>Also wenn ich das delete weglasse und eine Ausgabe aufrufe der Art:</p>
<pre><code class="language-cpp">CKlasse* pElement;

while(pVector-&gt;size() &gt; 0) {
  pElement = pVector-&gt;back();
  pVector-&gt;pop_back();
  TRACE(&quot;%s\n&quot;, pElement-&gt;Name());
}

pVector-&gt;clear();
</code></pre>
<p>Bekomme ich die wunderbare Ausgabe aller Namen... und zwar von jedem Objekt das ich angelegt habe. Deswegen müßten doch die Objekte auf dem Heap ok sein... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1225533</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1225533</guid><dc:creator><![CDATA[Meyer123]]></dc:creator><pubDate>Fri, 09 Feb 2007 09:50:37 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit vector on Fri, 09 Feb 2007 09:55:35 GMT]]></title><description><![CDATA[<p>Meyer123 schrieb:</p>
<blockquote>
<p>Also wenn der Heap doch defekt wäre würden doch Zeiger irgendwo hinzeigen die es nicht gibt oder?</p>
</blockquote>
<p>Das ist ja das unangenehme am &quot;undefined behaviour&quot; - du kannst dir nie sicher sein, was dein Programm macht. Und wenn der Heap kaputt ist, kann das auch nur die Kontroll-Informationen betreffen, die delete zum Freigeben deiner Objekte benötigt.</p>
<blockquote>
<p>Wenn ich keine Zeiger verwende sondern direkt die Objekte in meinen vector aufnehme... dann die Funktion verlasse werden die Objekte doch zerstört oder?</p>
</blockquote>
<p>Wenn die Objekte direkt im vector stehen, werden sie von dessen Destruktor automatisch freigegeben - aber du kannst den vector natürlich auch zwischen verschiedenen Funktionen weiterreichen (genauso wie du den Zeiger-vector rumreichen kannst) - dann überleben die Objekte auch so lange, wie du sie benötigst.</p>
<p>(beim Zeiger-Vector mußt du dich selber darum kümmern, daß vor dem Dtor-Aufruf alle Elemente freigegeben werden - andernfalls hast du ein Speicherleck)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1225539</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1225539</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 09 Feb 2007 09:55:35 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit vector on Fri, 09 Feb 2007 10:01:46 GMT]]></title><description><![CDATA[<blockquote>
<p>Wenn die Objekte direkt im vector stehen, werden sie von dessen Destruktor automatisch freigegeben - aber du kannst den vector natürlich auch zwischen verschiedenen Funktionen weiterreichen (genauso wie du den Zeiger-vector rumreichen kannst) - dann überleben die Objekte auch so lange, wie du sie benötigst.</p>
</blockquote>
<p>Erstmal danke für die Info :)...</p>
<p>Ich hab jetzt doch mehr herausgefunden :)... Also ich hab jetzt mal testweise einfach den vector weggelassen und folgendes festgestellt <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>
<pre><code class="language-cpp">CKlasse*pTest = new CKlasse();
TRACE(&quot;1. %d\n&quot;, (IKlasse*) pTest);
TRACE(&quot;2. %d\n&quot;, (CKlasse*) pTest);
</code></pre>
<p>Die Ausgabe ergibt folgendes:<br />
1. 3512428<br />
2. 3512344</p>
<p>CKlasse erbt von der abstrakten IKlasse... von CKlasse muss jedoch auf jedenfall der Destruktor aufgerufen werden...</p>
<p>Wenn ich nun delete (IKlasse*) pTest tritt der Fehler mit dem HEAP auf... wenn ich delete (CKlasse*) pTest aufrufe nicht... das Problem ist ich möchte in dem Vector viele IKlassen speichern (Verallgemeinerung)... CKlasse ist ja nur eine Konkretisierung... wieso tritt den dieser HEAP-Fehler auf... und wieso haben die beiden Zeiger unterschiedliche Adressen :(...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1225542</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1225542</guid><dc:creator><![CDATA[Meyer123]]></dc:creator><pubDate>Fri, 09 Feb 2007 10:01:46 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit vector on Fri, 09 Feb 2007 10:17:10 GMT]]></title><description><![CDATA[<p>Die Adressen sind unterschiedlich, weil du Merhfachvererbung verwendest - die Klasse wird aus ihren Elternklassen zusammengesetzt, indem diese nach bestimmten Gesichtspunkten hintereinandergeschrieben werden (die Differenz zwischen &quot;Startpunkt der Kindklasse&quot; und &quot;Startpunkt der Elternklasse&quot; ist idR konstant, so daß der Compiler bei Methodenaufrufen oder Typ-Casts den Offset draufrechnen kann).</p>
<p>Das Problem mit dem zerstörten Heap lässt sich auch auf diese Unterschiede zurückführen - der Dtor von IKlasse weiß nicht, daß er eigentlich nur ein kleiner Teil eines größeren CKlasse-Objekts ist, also löscht er nur seine eigenen Daten - und delete versucht auch nur, den IKlasse-Teil deines Objekts zu zerlegen. Und das macht Probleme, weil die Adresse des IKlasse-Teils nicht von new stammt (new hat die Adresse des kompletten Objekts zurückgeliefert).<br />
Die Lösung für dieses Dilemma nennt sich &quot;virtueller Destruktor&quot; - indem du den Dtor der Elternklasse 'virtual' definierst, wird zur Laufzeit der richtige Dtor für dein Objekt aufgerufen, egal über welchen Zeigertyp es zerstört werden soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1225552</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1225552</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 09 Feb 2007 10:17:10 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit vector on Fri, 09 Feb 2007 10:20:27 GMT]]></title><description><![CDATA[<p>Was würde ich nur ohen dieses Forum tuen... und vorallem ohne dich CStoll...</p>
<p>Hät ich aber auch selber dran denken können... dieses kleine Wort :(...</p>
<p>Ich danke dir auf jedenfall!!!</p>
<p>TAUSEND DANK!!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1225555</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1225555</guid><dc:creator><![CDATA[Meyer123]]></dc:creator><pubDate>Fri, 09 Feb 2007 10:20:27 GMT</pubDate></item></channel></rss>