<?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[Klasseninstanz aus Vector löschen]]></title><description><![CDATA[<p>Hallo,<br />
ich hab eine Vector-Liste, in der Klasseninstanzen gespeichert sind:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;vector&gt;
class Vehikel
{
   int Raeder;
   float Gewicht;
};

std::vector&lt;Vehikel&gt; Fahrzeuge;

int main()
{
	for(int i = 0; i &lt; 1000; i++)
	{
		Fahrzeuge.push_back(*(new Vehikel()));
	}
	std::cout&lt;&lt;&quot;Bis hier\n&quot;;

	for(std::vector&lt;Vehikel&gt;::iterator dIter(Fahrzeuge.begin()); dIter != Fahrzeuge.end(); ++dIter)
	{
		delete dIter;
		dIter = Fahrzeuge.erase(dIter);
	}
   return 0;
}
</code></pre>
<p>Das soll nur ein Bespielprogramm bei dem der Fehler auftritt. Er legt die Vectorreihe wie gewohnt an, aber beim löschen gibt es eine Fehlermeldung, ich glaube ein Assert. Weiß jemand vielleicht wo der Fehler liegt?</p>
<p>Vielen Dank für eine Antwort, viele Grüße<br />
Andreas</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/198313/klasseninstanz-aus-vector-löschen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 02 Oct 2026 03:29:28 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/198313.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 20 Nov 2007 15:47:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Klasseninstanz aus Vector löschen on Tue, 20 Nov 2007 15:47:03 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich hab eine Vector-Liste, in der Klasseninstanzen gespeichert sind:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;vector&gt;
class Vehikel
{
   int Raeder;
   float Gewicht;
};

std::vector&lt;Vehikel&gt; Fahrzeuge;

int main()
{
	for(int i = 0; i &lt; 1000; i++)
	{
		Fahrzeuge.push_back(*(new Vehikel()));
	}
	std::cout&lt;&lt;&quot;Bis hier\n&quot;;

	for(std::vector&lt;Vehikel&gt;::iterator dIter(Fahrzeuge.begin()); dIter != Fahrzeuge.end(); ++dIter)
	{
		delete dIter;
		dIter = Fahrzeuge.erase(dIter);
	}
   return 0;
}
</code></pre>
<p>Das soll nur ein Bespielprogramm bei dem der Fehler auftritt. Er legt die Vectorreihe wie gewohnt an, aber beim löschen gibt es eine Fehlermeldung, ich glaube ein Assert. Weiß jemand vielleicht wo der Fehler liegt?</p>
<p>Vielen Dank für eine Antwort, viele Grüße<br />
Andreas</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1406705</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1406705</guid><dc:creator><![CDATA[Andreas_L]]></dc:creator><pubDate>Tue, 20 Nov 2007 15:47:03 GMT</pubDate></item><item><title><![CDATA[Reply to Klasseninstanz aus Vector löschen on Tue, 20 Nov 2007 15:54:32 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Das geht so nicht. Du versuchst immerhin einen Iterator zu löschen. Warum erzeugst du die Instanzen überhaupt mit new wenn du einen vector auf Objekte hast? Lass das einfach weg.</p>
<pre><code class="language-cpp">std::vector&lt;Vehikel&gt; Fahrzeuge;

int main()
{
    for(int i = 0; i &lt; 1000; i++)
    {
        Fahrzeuge.push_back(Vehikel());
    }
    std::cout&lt;&lt;&quot;Bis hier\n&quot;;
// statt der Schleife reicht auch ein Fahrzeuge.clear();
    for(std::vector&lt;Vehikel&gt;::iterator dIter(Fahrzeuge.begin()); dIter != Fahrzeuge.end(); ++dIter)
    {
        dIter = Fahrzeuge.erase(dIter);
    }
   return 0;
}
</code></pre>
<p>Falls du einen vector auf Zeiger von Vehikel hättest würde löschen so aussehen.</p>
<pre><code class="language-cpp">delete *dIter; //einfach dereferenzieren
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1406709</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1406709</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Tue, 20 Nov 2007 15:54:32 GMT</pubDate></item><item><title><![CDATA[Reply to Klasseninstanz aus Vector löschen on Tue, 20 Nov 2007 17:22:41 GMT]]></title><description><![CDATA[<p>Hi,<br />
danke für die Antwort.<br />
Aber ich hatte das bisher immer so verstanden, dass man größere Datenmengen mit new erzeugen soll, damit sie nicht den Stack so belasten (ich muss zugeben so genau kenn ich mich mit Heap und Stack nicht aus).<br />
Deshalb dachte ich muss ich die Objekte in meinem Programm mit new erzeugen, da sie schon recht groß sind und es viele werden können ( Das andere war nur ein Beispiel-Programm, die echten Klassen sind wesentlich komplexer)</p>
<p>Viele Grüße<br />
Andreas</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1406772</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1406772</guid><dc:creator><![CDATA[Andreas_L]]></dc:creator><pubDate>Tue, 20 Nov 2007 17:22:41 GMT</pubDate></item><item><title><![CDATA[Reply to Klasseninstanz aus Vector löschen on Tue, 20 Nov 2007 17:27:58 GMT]]></title><description><![CDATA[<p>Andreas_L schrieb:</p>
<blockquote>
<p>Deshalb dachte ich muss ich die Objekte in meinem Programm mit new erzeugen, da sie schon recht groß sind und es viele werden können ( Das andere war nur ein Beispiel-Programm, die echten Klassen sind wesentlich komplexer)</p>
</blockquote>
<p>Das ist zu undifferenziert betrachtet. Du kannst natürlich keine Arrays großer Objekte auf dem Stack anlegen, aber letztlich ist <strong>alles</strong>, was eine variable Größe hat, irgendwo im Freispeicher abgelegt. D.h. auch wenn der Vector auf dem Stack liegt, liegen die vom Vector verwalteten Daten nicht dort.</p>
<p>Davon ab speicherst Du in Deinem Code sowieso keine mit new erzeugten Objekte im Vector, sondern Kopien derselben (die mit new erzeugten Objekte sind danach übrigens verloren, sprich hier ist ein Leck). Allein deshalb funktioniert delete auf den Iterator schon nicht.</p>
<p>Du könntest zwar Zeiger auf die Objekte im Vector speichern, aber ich bin mir recht sicher, dass Du unter Beachtung aller Tatsachen das nicht wirklich möchtest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1406776</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1406776</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 20 Nov 2007 17:27:58 GMT</pubDate></item><item><title><![CDATA[Reply to Klasseninstanz aus Vector löschen on Tue, 20 Nov 2007 17:41:36 GMT]]></title><description><![CDATA[<p>Hi,<br />
heißt das auch wenn ich mehrfach<br />
Fahrzeuge.push_back(Vehikel());<br />
aufrufe und Vehikel sehr groß ist brauch ich keine Angst vor einem Stack-Error zu haben?<br />
Ich brauch mich auch nicht weiter um das Objekt kümmern, wenn ich erase aufrufe wird automatisch de Destruktor von Vehikel aufgerufen?</p>
<p>Viele Grüße<br />
Andreas</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1406785</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1406785</guid><dc:creator><![CDATA[Andreas_L]]></dc:creator><pubDate>Tue, 20 Nov 2007 17:41:36 GMT</pubDate></item><item><title><![CDATA[Reply to Klasseninstanz aus Vector löschen on Tue, 20 Nov 2007 17:48:16 GMT]]></title><description><![CDATA[<p>Exakt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1406788</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1406788</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 20 Nov 2007 17:48:16 GMT</pubDate></item><item><title><![CDATA[Reply to Klasseninstanz aus Vector löschen on Tue, 20 Nov 2007 18:20:34 GMT]]></title><description><![CDATA[<p>Hi,<br />
eine letzte Frage noch <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="🙂"
    /><br />
ich hab den Code etwas verändert:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;vector&gt;
class Vehikel
{
   int Raeder;
   float Gewicht;
public:
	Vehikel(){ std::cout&lt;&lt;&quot;Im Konstruktor!\n&quot;;}
	~Vehikel() { std::cout&lt;&lt;&quot;Im Destruktor!\n&quot;;}
};

std::vector&lt;Vehikel&gt; Fahrzeuge;

int main()
{
	for(int i = 0; i &lt; 10; i++)
	{
		Fahrzeuge.push_back(Vehikel());
	}
	std::cout&lt;&lt;&quot;Bis hier\n&quot;;

	for(std::vector&lt;Vehikel&gt;::iterator dIter(Fahrzeuge.begin()); dIter != Fahrzeuge.end(); ++dIter)
	{
		dIter = Fahrzeuge.erase(dIter);
	}
   return 0;
}
</code></pre>
<p>Wenn ich zu Beginn den Destruktor auskommentiere kommt wie erwartet 10 mal die Ausgabe &quot;Im Konstruktor&quot;.<br />
Nehme ich jetzt aber den Destruktor hinzu kommt so eine Ausgabe:</p>
<p>Im Konstruktor!<br />
Im Destruktor!<br />
Im Konstruktor!<br />
Im Destruktor!<br />
Im Destruktor!<br />
Im Konstruktor!<br />
Im Destruktor!<br />
Im Destruktor!<br />
Im Destruktor!<br />
Im Konstruktor!<br />
Im Destruktor!<br />
Im Konstruktor!<br />
Im Destruktor!<br />
Im Destruktor!<br />
Im Destruktor!<br />
Im Destruktor!<br />
Im Destruktor!<br />
Im Konstruktor!<br />
Im Destruktor!<br />
Im Konstruktor!<br />
Im Destruktor!<br />
Im Konstruktor!<br />
Im Destruktor!<br />
Im Konstruktor!<br />
Im Destruktor!<br />
Im Destruktor!<br />
Im Destruktor!<br />
Im Destruktor!<br />
Im Destruktor!<br />
Im Destruktor!<br />
Im Destruktor!<br />
Im Destruktor!<br />
Im Destruktor!<br />
Im Konstruktor!<br />
Im Destruktor!<br />
Bis hier<br />
Im Destruktor!<br />
Im Destruktor!<br />
Im Destruktor!<br />
Im Destruktor!<br />
Im Destruktor!</p>
<p>Was soll das?<br />
Das müssten 10 mal &quot;im Konstruktor&quot; und 30 mal &quot;im Destruktor&quot; sein. Wenn er jedesmal eine Kopie anlegt kann ich das ja noch verstehen, aber wieso gleich 30 mal?<br />
Meine einzige Erklärung wäre, er legt das Objekt an, übergibt es als Kopie der Methode, dann wird es zum ersten Mal gelöscht. Im weiteren Verlauf speichert die Methode eine Kopie davon in der Vectorreihe; es wird das 2. Mal gelöscht. Das dritte Mal würde dann durch mein erase() geschehen. Aber dann lässt sich nicht erklären, warum nach &quot;Bis hier&quot; nur noch 5 mal die Meldung kommt und nicht 10 mal, schließlich will ich ja 10 Objekte löschen.</p>
<p>Ansich ist mir ja seine Speicherumwälzung egal, aber es sollte halt möglichst schnell gehen und ich habe eigentlich so eine Art Modell bei dem Häuser gebaut werden und die erhöhen dann die Anzahl der möglichen Wohnplätze (eine Variable des Haupt-Spiels). Beim löschen eines Hauses wurde im Destruktur die Anzahl der Wohnplätze dann wieder verringert. Nun stand da auf einmal eine negative Anzahl an Wohnplätzen, was sich mit dieser Ausgabe deckt.<br />
Was hab ich falsch gemacht, wie muss ich es ändern?<br />
Viele Grüße<br />
Andreas</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1406821</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1406821</guid><dc:creator><![CDATA[Andreas_L]]></dc:creator><pubDate>Tue, 20 Nov 2007 18:20:34 GMT</pubDate></item><item><title><![CDATA[Reply to Klasseninstanz aus Vector löschen on Tue, 20 Nov 2007 22:05:51 GMT]]></title><description><![CDATA[<p>Am besten ist es wohl du machst noch eine Ausgabe im CopyKonstruktor. Dann sollte alles klarer werden.<br />
Wenn beim vector der Speicherplatz zum Anfügen eines neuen Objektes nicht ausreicht wird umkopiert. Das kann man verhindern, indem man vor dem Anfügen mit reserve ausreichend Platz reserviert.<br />
Warum nach der erase-Schleife nur 5-mal Destruktor steht? Dann überleg mal was erase zurückgibt und ++dIter bewirkt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1406994</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1406994</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Tue, 20 Nov 2007 22:05:51 GMT</pubDate></item></channel></rss>