<?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[std::vector löschen]]></title><description><![CDATA[<p>Hi, wie löscht man eigentlich einen std::vector richtig? Dazu findet man ja viele unterschiedliche Varianten im Internet.</p>
<p>Einen</p>
<pre><code>std::vector&lt;ExampleClass&gt; exampleVector;
</code></pre>
<p>braucht man ja nicht selber löschen.<br />
Was aber wenn ich stattdessen Pointer habe?</p>
<pre><code>std::vector&lt;ExampleClass*&gt; exampleVector;
</code></pre>
<p>Ist folgender Code richtig bzw. guter Programmierstil?</p>
<pre><code>for(std::vector&lt;ExampleClass*&gt;::iterator iterator = exampleVector.begin(); iterator != exampleVector.end(); ++iterator)
delete *iterator;
exampleVector.clear();
</code></pre>
<p>Und was mache ich wenn dieser Vector jetzt auch noch statischer Member einer Klasse ist?</p>
<pre><code>std::vector&lt;ExampleClass*&gt; exampleVector;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/285133/std-vector-löschen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 10:27:53 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/285133.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 14 Apr 2011 15:47:37 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::vector löschen on Thu, 14 Apr 2011 15:47:37 GMT]]></title><description><![CDATA[<p>Hi, wie löscht man eigentlich einen std::vector richtig? Dazu findet man ja viele unterschiedliche Varianten im Internet.</p>
<p>Einen</p>
<pre><code>std::vector&lt;ExampleClass&gt; exampleVector;
</code></pre>
<p>braucht man ja nicht selber löschen.<br />
Was aber wenn ich stattdessen Pointer habe?</p>
<pre><code>std::vector&lt;ExampleClass*&gt; exampleVector;
</code></pre>
<p>Ist folgender Code richtig bzw. guter Programmierstil?</p>
<pre><code>for(std::vector&lt;ExampleClass*&gt;::iterator iterator = exampleVector.begin(); iterator != exampleVector.end(); ++iterator)
delete *iterator;
exampleVector.clear();
</code></pre>
<p>Und was mache ich wenn dieser Vector jetzt auch noch statischer Member einer Klasse ist?</p>
<pre><code>std::vector&lt;ExampleClass*&gt; exampleVector;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2049441</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2049441</guid><dc:creator><![CDATA[Student83]]></dc:creator><pubDate>Thu, 14 Apr 2011 15:47:37 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector löschen on Thu, 14 Apr 2011 15:49:53 GMT]]></title><description><![CDATA[<p>Student83 schrieb:</p>
<blockquote>
<pre><code>std::vector&lt;ExampleClass*&gt; exampleVector;
</code></pre>
</blockquote>
<p>Ich würde das mit Smartpointern lösen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2049444</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2049444</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Thu, 14 Apr 2011 15:49:53 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector löschen on Thu, 14 Apr 2011 15:49:59 GMT]]></title><description><![CDATA[<p>Der rechte Weg, ist einen ptr_vector zu nehmen, der selber im Destruktor die delete-Schleife macht.<br />
Solange so ein Container nicht da ist, mach es irgendwie.<br />
Aber bald ist er da.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2049445</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2049445</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 14 Apr 2011 15:49:59 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector löschen on Thu, 14 Apr 2011 15:57:21 GMT]]></title><description><![CDATA[<p>Ist zwar richtig, aber nicht schön. Die boost Bibliotheken bieten pointer_container an, die genau diesen Fall abdecken, d.h. sie übernehmen den Besitz der in ihnen gespeicherten Zeiger und löschen sie im Destruktor.</p>
<p>Falls du keinen Zugriff auf die boost Bibliotheken hast kannst du auch smart pointer aus TR1 benutzen, wenn dein Compiler bereits TR1 unterstützt. Das sähe dann so aus (mit shared_ptr, möglicherweise ist unique_ptr die bessere Alternative, kenne mich mit TR1 nicht aus):</p>
<pre><code class="language-cpp">std::vector&lt;std::tr1::shared_ptr&lt;ExampleClass&gt; &gt; exampleVector;
</code></pre>
<p>PS:<br />
Zu langsam <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":/"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2049453</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2049453</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Thu, 14 Apr 2011 15:57:21 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector löschen on Thu, 14 Apr 2011 17:03:05 GMT]]></title><description><![CDATA[<p>D.h. ohne Smartpointer lässt sich ein solcher statischer Vector von rohen Pointern nicht löschen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2049499</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2049499</guid><dc:creator><![CDATA[Student83]]></dc:creator><pubDate>Thu, 14 Apr 2011 17:03:05 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector löschen on Thu, 14 Apr 2011 17:05:13 GMT]]></title><description><![CDATA[<p>Doch, aber nur manuell (d.h. <code>delete</code> auf jedes Element anwenden). Und das birgt einige Risiken, z.B. im Hinblick auf vergessene Freigabe, Exceptionsicherheit, fehlende Wertsemantik und damit auch normale Operationen, die zum Problem werden (z.B. STL-Algorithmen oder Kopien/Zuweisungen von Containern).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2049501</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2049501</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 14 Apr 2011 17:05:13 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector löschen on Thu, 14 Apr 2011 17:07:42 GMT]]></title><description><![CDATA[<p>Student83 schrieb:</p>
<blockquote>
<p>D.h. ohne Smartpointer lässt sich ein solcher statischer Vector von rohen Pointern nicht löschen?</p>
</blockquote>
<p>Doch, durch iterieren und einzeln Löschen (vorausgesetzt der vector hält den Besitz, wenn nicht wären aber auch die Smartpointerlösung oder die ptr-Container falsch).</p>
<p>Nur ziehen halt viele den leichten Weg vor, wo man sich nach Möglichkeit nicht selbst um die Freigabe kümmern muss (Jede Sache, um die man sich nicht selbst kümmern muss, kann man auch nicht irrtümlich vergessen).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2049502</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2049502</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Thu, 14 Apr 2011 17:07:42 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector löschen on Thu, 14 Apr 2011 17:08:10 GMT]]></title><description><![CDATA[<p>Eine Lösung wäre es noch, diesen vector&lt;&gt; in einen Singleton zu verpacken, der bei seiner Vernichtung die vector&lt;&gt;-Elemente freigibt.</p>
<p>PS: Wazu brauchst du das überhaupt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2049503</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2049503</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 14 Apr 2011 17:08:10 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector löschen on Thu, 14 Apr 2011 17:35:18 GMT]]></title><description><![CDATA[<p>Gute Frage, ich könnte es wohl auch so</p>
<pre><code>std::vector&lt;ExampleClass&gt; exampleVector;
</code></pre>
<p>ohne Verwendung von Pointern implementieren. Aber ist es nicht deutlich schneller einen Vector von Pointern zu durchsuchen? Zumindest meine ich das so gelesen zu haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2049516</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2049516</guid><dc:creator><![CDATA[Student83]]></dc:creator><pubDate>Thu, 14 Apr 2011 17:35:18 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector löschen on Thu, 14 Apr 2011 17:39:59 GMT]]></title><description><![CDATA[<p>Nein, das Durchsuchen wird in einem normalen vector schneller sein, weil du nicht jeden Zeiger dereferenzieren mußt (wobei: die Unterschiede sind nur minimal). Größere Geschwindigkeits-Unterschiede könnten sich höchstens ergeben, wenn du den Vector-Inhalt regelmäßig änderst (einfügen, löschen etc im gesamten Bereich).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2049522</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2049522</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 14 Apr 2011 17:39:59 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector löschen on Thu, 14 Apr 2011 17:50:13 GMT]]></title><description><![CDATA[<p>Und sofern das nicht die zeitkritische Stelle deines Programms ist (was du mit einem Profiler herausfinden kannst), entscheide dich für die naheliegende Lösung, also für <code>std::vector&lt;ExampleClass&gt;</code> . Optimieren kannst du später immer noch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2049529</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2049529</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 14 Apr 2011 17:50:13 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector löschen on Thu, 14 Apr 2011 23:56:25 GMT]]></title><description><![CDATA[<p>Der Vector wird einmalig beim Anwendungsstart gefüllt und danach nicht mehr verändert. Ich habe mich übrigens getäuscht ich komme an dieser Stelle an Pointern nicht vorbei, da diese auf Membervariablen zeigen und ich ansonsten ja lediglich Kopien von diesen erstelle.<br />
Übrigens habe ich eben wieder den Text gefunden wo gesagt wird dass man in den STL-Containern Pointer auf die Objekte anstatt die Objekten selber verwenden soll.<br />
<a href="http://www.tantalon.com/pete/gdc2001roundtablereport.htm" rel="nofollow">http://www.tantalon.com/pete/gdc2001roundtablereport.htm</a></p>
<blockquote>
<p>Store pointers to objects rather than the objects themselves</p>
</blockquote>
<p>Zudem werden Smartpointer wie schon von euch empfohlen:</p>
<blockquote>
<p>Store &quot;smart&quot; pointers (see Boost libraries)</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2049693</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2049693</guid><dc:creator><![CDATA[Student83]]></dc:creator><pubDate>Thu, 14 Apr 2011 23:56:25 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector löschen on Fri, 15 Apr 2011 00:11:38 GMT]]></title><description><![CDATA[<p>Student83 schrieb:</p>
<blockquote>
<p>Der Vector wird einmalig beim Anwendungsstart gefüllt und danach nicht mehr verändert. Ich habe mich übrigens getäuscht ich komme an dieser Stelle an Pointern nicht vorbei, da diese auf Membervariablen zeigen und ich ansonsten ja lediglich Kopien von diesen erstelle.</p>
</blockquote>
<p>Dann willst Du ja auch gar nicht deleten.</p>
<p>Student83 schrieb:</p>
<blockquote>
<blockquote>
<p>Store pointers to objects rather than the objects themselves</p>
</blockquote>
</blockquote>
<p>Das ist so allgemein Quatsch.<br />
Die Zusammenstellung riecht nach 1995, nicht nach 2009.</p>
<p>Student83 schrieb:</p>
<blockquote>
<p>Zudem werden Smartpointer wie schon von euch empfohlen:</p>
<blockquote>
<p>Store &quot;smart&quot; pointers (see Boost libraries)</p>
</blockquote>
</blockquote>
<p>ptr_containers kannten die wohl nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2049695</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2049695</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 15 Apr 2011 00:11:38 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector löschen on Fri, 15 Apr 2011 00:28:09 GMT]]></title><description><![CDATA[<blockquote>
<p>Dann willst Du ja auch gar nicht deleten.</p>
</blockquote>
<p>Während das Programm läuft nicht. Das Stimmt. Aber muss ich den statischen Vector dann nicht spätestens beim Beenden freigeben?</p>
<blockquote>
<p>Die Zusammenstellung riecht nach 1995, nicht nach 2009.</p>
</blockquote>
<p>Ok, da kannst du recht haben.</p>
<blockquote>
<p>ptr_containers kannten die wohl nicht.</p>
</blockquote>
<p>Boost möchte ich eigentlich nicht verwenden. Wann wird dieser ptr_vector denn zum Standard?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2049697</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2049697</guid><dc:creator><![CDATA[Student83]]></dc:creator><pubDate>Fri, 15 Apr 2011 00:28:09 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector löschen on Fri, 15 Apr 2011 00:34:03 GMT]]></title><description><![CDATA[<p>Student83 schrieb:</p>
<blockquote>
<blockquote>
<p>Dann willst Du ja auch gar nicht deleten.</p>
</blockquote>
<p>Während das Programm läuft nicht. Das Stimmt. Aber muss ich den statischen Vector dann nicht spätestens beim Beenden freigeben?</p>
</blockquote>
<p>Aber zeigen deine Zeiger nicht alle auf Membervariablen fremder Objekte und die fremden Objekte löschen ihre Members schon?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2049698</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2049698</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 15 Apr 2011 00:34:03 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector löschen on Fri, 15 Apr 2011 06:54:35 GMT]]></title><description><![CDATA[<p>wieso willst du eigentlich einen statischen vektor der zeiger auf alles mögliche speichert, unter anderem auch auf membervariablen(die eh gelöscht werden) und somit das konzept der kapselung untergräbt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2049719</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2049719</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Fri, 15 Apr 2011 06:54:35 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector löschen on Mon, 18 Apr 2011 19:45:57 GMT]]></title><description><![CDATA[<p>Das ganze Konzept ist etwas kompliziert zu erklären, aber im Wesentlichen habe ich eine Klasse Object die z.B. einen statischen Member &quot;name&quot; vom Typ &quot;Property&quot; hat. Initialisiert wird dieser Member mit der statischen Register-Funktion der Property Klasse, die einen Zeiger auf dieses Property in dem statischen Vector &quot;propertyList&quot; speichert.</p>
<p>Was ich nicht gesehen habe ist, dass ja dann der statische Member name der eigentliche Eigentümer dieses Properties ist und dieses damit wie von Volkard richtig gefolgert dann automatisch gelöscht wird. Habe mir also Gedanken über ein Problem gemacht, das gar keines ist.<br />
Und das Konzept der Kapselung verletze ich nicht (glaube ich zumindest ;)), da alle Member und auch der Vector protected sind und auf diese nur über Funktionen zugegriffen wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2049891</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2049891</guid><dc:creator><![CDATA[Student83]]></dc:creator><pubDate>Mon, 18 Apr 2011 19:45:57 GMT</pubDate></item></channel></rss>