<?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[delete auf ein Vectorelement]]></title><description><![CDATA[<p>Hallo!<br />
Ich habe folgendes Codebeispiel:</p>
<pre><code class="language-cpp">std::vector &lt;cStream*&gt; Streams;

Streams.push_back(new cStream)

delete Streams[0];
Streams.erase(Streams.begin());
</code></pre>
<p>Das ist jetzt nur ein vereinfachtes Beispiel. Natürlich sind in dem<br />
Vector noch mehr cStream Pointer. Mein Problem ist, dass das delete hier<br />
einen Segfault ergibt. Ich will nicht nur den Pointer aus dem Vecor<br />
entfernen, sondern auch den Speicher, der beim push_back mit new angefordert<br />
wurde, wieder freigeben.<br />
Warum funktioniert es mit diesem delete nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/243109/delete-auf-ein-vectorelement</link><generator>RSS for Node</generator><lastBuildDate>Sun, 20 Sep 2026 05:15:27 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/243109.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 12 Jun 2009 13:19:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to delete auf ein Vectorelement on Fri, 12 Jun 2009 13:19:29 GMT]]></title><description><![CDATA[<p>Hallo!<br />
Ich habe folgendes Codebeispiel:</p>
<pre><code class="language-cpp">std::vector &lt;cStream*&gt; Streams;

Streams.push_back(new cStream)

delete Streams[0];
Streams.erase(Streams.begin());
</code></pre>
<p>Das ist jetzt nur ein vereinfachtes Beispiel. Natürlich sind in dem<br />
Vector noch mehr cStream Pointer. Mein Problem ist, dass das delete hier<br />
einen Segfault ergibt. Ich will nicht nur den Pointer aus dem Vecor<br />
entfernen, sondern auch den Speicher, der beim push_back mit new angefordert<br />
wurde, wieder freigeben.<br />
Warum funktioniert es mit diesem delete nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1725581</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1725581</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Fri, 12 Jun 2009 13:19:29 GMT</pubDate></item><item><title><![CDATA[Reply to delete auf ein Vectorelement on Fri, 12 Jun 2009 13:26:32 GMT]]></title><description><![CDATA[<p>Warum wollen so viele Leute ihre eigene Speicherverwaltung in Container packen? Container sind ja unter anderem gerade dazu da, einem diesbezüglich Arbeit abzunehmen. Bis auf wenige Fälle (vor allem Nicht-Kopierbarkeit, Polymorphie) gibt es wirklich keinen Grund für besitzende Zeiger in Containern. Und selbst in diesen Fällen gibt es bessere Alternativen, zum Beispiel die Pointer-Container von Boost.</p>
<p>Was spricht bei dir gegen Folgendes?</p>
<pre><code class="language-cpp">std::vector &lt;cStream&gt; Streams;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1725584</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1725584</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 12 Jun 2009 13:26:32 GMT</pubDate></item><item><title><![CDATA[Reply to delete auf ein Vectorelement on Fri, 12 Jun 2009 13:42:35 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Was spricht bei dir gegen Folgendes?</p>
<pre><code class="language-cpp">std::vector &lt;cStream&gt; Streams;
</code></pre>
</blockquote>
<p>Daß Wertsemantik bei einer Streamklasse unsinnig ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1725594</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1725594</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Fri, 12 Jun 2009 13:42:35 GMT</pubDate></item><item><title><![CDATA[Reply to delete auf ein Vectorelement on Fri, 12 Jun 2009 13:49:02 GMT]]></title><description><![CDATA[<p>audacia schrieb:</p>
<blockquote>
<p>Daß Wertsemantik bei einer Streamklasse unsinnig ist?</p>
</blockquote>
<p>Huch, hab gar nicht so auf die Bezeichner geachtet. Sorry in diesem Fall... <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 />
(Wenn sich mir die Möglichkeit böte, würde ich dennoch zu Pointer-Containern greifen).</p>
<p>Aber zu dem Problem:<br />
Könnte es sein, dass die <code>cStream</code> -Klasse intern etwas falsch handhabt? Ist der Destruktor zum Beispiel richtig implementiert? Versuch ansonsten mal, mit dem Debugger den Fehler genau zu lokalisieren...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1725596</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1725596</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 12 Jun 2009 13:49:02 GMT</pubDate></item><item><title><![CDATA[Reply to delete auf ein Vectorelement on Fri, 12 Jun 2009 14:14:18 GMT]]></title><description><![CDATA[<p>Dran gedacht, dass alle Iteratoren beim Aufruf von erase() ungültig werden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1725604</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1725604</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Fri, 12 Jun 2009 14:14:18 GMT</pubDate></item><item><title><![CDATA[Reply to delete auf ein Vectorelement on Fri, 12 Jun 2009 14:23:02 GMT]]></title><description><![CDATA[<p>Der Destruktor von cStream gibt sämtlichen allokierten speicher innerhalb<br />
der Klasse frei.<br />
Und wie kann ich das Problem mit den ungültigen Iteratoren umgehen?<br />
Ich werd mir aber trotzdem mal die boost-Container angucken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1725609</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1725609</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Fri, 12 Jun 2009 14:23:02 GMT</pubDate></item><item><title><![CDATA[Reply to delete auf ein Vectorelement on Fri, 12 Jun 2009 14:35:22 GMT]]></title><description><![CDATA[<p>Tritt dein Problem wirklich auch im oben geposteten Beispiel auf? Da kann es nämlich nicht an den Iteratoren liegen. Falls ja, würde ich trotzdem mal genau debuggen und schauen, ob zum Beispiel ein ungültiger Zeiger freigegeben wird oder so.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1725615</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1725615</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 12 Jun 2009 14:35:22 GMT</pubDate></item><item><title><![CDATA[Reply to delete auf ein Vectorelement on Fri, 12 Jun 2009 14:45:14 GMT]]></title><description><![CDATA[<p>mase schrieb:</p>
<blockquote>
<p>Und wie kann ich das Problem mit den ungültigen Iteratoren umgehen?</p>
</blockquote>
<p>mit std::list...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1725624</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1725624</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 12 Jun 2009 14:45:14 GMT</pubDate></item><item><title><![CDATA[Reply to delete auf ein Vectorelement on Fri, 12 Jun 2009 14:54:19 GMT]]></title><description><![CDATA[<p>indem man den Rückgabewert von erase nutzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1725630</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1725630</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Fri, 12 Jun 2009 14:54:19 GMT</pubDate></item><item><title><![CDATA[Reply to delete auf ein Vectorelement on Fri, 12 Jun 2009 14:54:48 GMT]]></title><description><![CDATA[<p>Naja, nach dem erase() wird bei mir gar kein Iterator mehr verwendet.<br />
Vor dem nächsten Aufruf von erase() wird der Iterator neu initialisiert<br />
mit Streams.begin().</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1725631</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1725631</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Fri, 12 Jun 2009 14:54:48 GMT</pubDate></item><item><title><![CDATA[Reply to delete auf ein Vectorelement on Fri, 12 Jun 2009 15:29:15 GMT]]></title><description><![CDATA[<p>Ich poste mal etwas mehr Code.</p>
<p>Die Streams werden so in den Vector eingefügt:</p>
<pre><code class="language-cpp">Streams.push_back(new cStream);
</code></pre>
<p>Wenn ein Stream entfernt werden soll, wird folgende Funktion aufgerufen:</p>
<pre><code class="language-cpp">void RemoveStream(int _StreamNumber)
{
    //remove stream completely
    Streams[_StreamNumber]-&gt;CloseStream();
    std::vector&lt;cStream*&gt;::iterator Iter = Streams.begin();
    for (int i = 0; i &lt; _StreamNumber; i++)
    {
        Iter++;
    }

    delete Streams[_StreamNumber];
    Streams.erase(Iter);
    NumberOfStreams--;

    return;
}
</code></pre>
<p>_StreamNumber ist der entsprechenden Bezeichner.<br />
Das CloseStream() der cStream-Klasse löscht nichts. Es wird lediglich die<br />
Serververbindung beendet.<br />
Das delete hier führt zu einem Segfault.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1725653</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1725653</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Fri, 12 Jun 2009 15:29:15 GMT</pubDate></item><item><title><![CDATA[Reply to delete auf ein Vectorelement on Fri, 12 Jun 2009 19:09:28 GMT]]></title><description><![CDATA[<p>Ich hab es jetzt mal mit einem Smartpointer in einem Pointervector von<br />
libboost probiert:</p>
<pre><code class="language-cpp">Streams.push_back(boost::shared_ptr&lt;cStream&gt;(new cStream));
</code></pre>
<p>Der Vector ist so deklariert:</p>
<pre><code class="language-cpp">boost::ptr_vector&lt;boost::shared_ptr&lt;cStream&gt; &gt; Streams;
</code></pre>
<p>Doch es kompiliert nicht.<br />
By the way: Ist es besser, anstatt erase() ein release() aufzurufen, wenn<br />
das Objekt auch zerstört werden soll?<br />
Das ist die Fehlermeldung des Compilers:</p>
<pre><code>error: no matching function for call to 'boost::ptr_vector&lt;boost::shared_ptr&lt;cStream&gt;, boost::heap_clone_allocator, 
std::allocator&lt;void*&gt; &gt;::push_back(boost::shared_ptr&lt;cStream&gt;)'
/usr/include/boost/ptr_container/ptr_sequence_adapter.hpp:178: note: candidates are: void boost::ptr_sequence_adapter&lt;T, VoidPtrSeq,
CloneAllocator&gt;::push_back(typename boost::ptr_container_detail::reversible_ptr_container&lt;boost::ptr_container
_detail::sequence_config&lt;T, VoidPtrSeq&gt;, CloneAllocator&gt;::value_type) [with T
= boost::shared_ptr&lt;cStream&gt;, VoidPtrSeq = std::vector&lt;void*, std::allocator&lt;void*&gt; &gt;, CloneAllocator = boost::heap_clone_allocator]
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1725746</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1725746</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Fri, 12 Jun 2009 19:09:28 GMT</pubDate></item><item><title><![CDATA[Reply to delete auf ein Vectorelement on Fri, 12 Jun 2009 20:24:56 GMT]]></title><description><![CDATA[<p>Wieso <code>ptr_vector</code> und <code>shared_ptr</code> ? Entweder oder, eins davon reicht. Ich würde <code>ptr_vector</code> empfehlen, da du mit dem Smart-Pointer mit grosser Wahrscheinlichkeit Overhead hast, den du gar nicht benötigst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1725774</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1725774</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 12 Jun 2009 20:24:56 GMT</pubDate></item><item><title><![CDATA[Reply to delete auf ein Vectorelement on Fri, 12 Jun 2009 20:42:19 GMT]]></title><description><![CDATA[<p>Ich hab mich für den ptc_vector entschieden. Seh ich das richtig, dass die<br />
Elemente darin automatisch dereferenziert werden, ich also mit dem . Operator<br />
zugreifen muss, anstatt -&gt;?<br />
Aber folgender Aufruf führt zu einem Segfault:</p>
<pre><code class="language-cpp">boost::ptr_vector&lt;cStream&gt;::iterator Iter = Streams.begin();
    for (int i = 0; i &lt; _StreamNumber; i++)
    {
        Iter++;
    }

    Streams.erase(Iter);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1725790</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1725790</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Fri, 12 Jun 2009 20:42:19 GMT</pubDate></item><item><title><![CDATA[Reply to delete auf ein Vectorelement on Fri, 12 Jun 2009 20:48:43 GMT]]></title><description><![CDATA[<p>Du versuchst wahrscheinlich, ein Element zu löschen, das bereits jenseits der Sequenz liegt.</p>
<p>Normalerweise iteriert man aber auch anders. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<pre><code class="language-cpp">for (boost::ptr_vector&lt;cStream&gt;::iterator iter = Streams.begin(); i != Streams.end(); ++i) // wichtig: nicht i++
{
   // Mache für jedes Element etwas
}
</code></pre>
<p>Wenn du allerdings nur ein Element an einem bestimmten Index löschen willst, kannst du das bei Random-Access-Containern auch so machen:</p>
<pre><code class="language-cpp">Streams.erase(Streams.begin() + Index);
</code></pre>
<p>Aber sei dir bewusst, dass Zeiger, Referenzen und Iteratoren auf Elemente des Containers anschliessend ungültig werden können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1725796</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1725796</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 12 Jun 2009 20:48:43 GMT</pubDate></item><item><title><![CDATA[Reply to delete auf ein Vectorelement on Sat, 13 Jun 2009 09:12:52 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Du versuchst wahrscheinlich, ein Element zu löschen, das bereits jenseits der Sequenz liegt.</p>
<p>Normalerweise iteriert man aber auch anders. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<pre><code class="language-cpp">for (boost::ptr_vector&lt;cStream&gt;::iterator iter = Streams.begin(); i != Streams.end(); ++i) // wichtig: nicht i++
{
   // Mache für jedes Element etwas
}
</code></pre>
<p>Wenn du allerdings nur ein Element an einem bestimmten Index löschen willst, kannst du das bei Random-Access-Containern auch so machen:</p>
<pre><code class="language-cpp">Streams.erase(Streams.begin() + Index);
</code></pre>
<p>Aber sei dir bewusst, dass Zeiger, Referenzen und Iteratoren auf Elemente des Containers anschliessend ungültig werden können.</p>
</blockquote>
<p>Ich hab's nach der 2. Methode gemacht. Ich hab jedoch gelesen, dass release(),<br />
anstatt erase() aufgerufen werden sollte, da so auch der Speicher für das<br />
Element freigegeben würde. Mein Ziel war ja, dass nicht nur das Element<br />
aus dem Vector entfernt wird, sondern auch ein delete für das Element auf-<br />
gerufen wird.<br />
Seh ich das richtig:<br />
Beim std::vector muss als Typ &lt;cStream*&gt; angegeben werden, beim<br />
boost::ptr_vector ein &lt;cStream&gt;, sonst wären es ja Zeiger auf Zeiger.<br />
Der Elementzugriff erfolgt mit Punktoperator, anstatt -&gt;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1725897</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1725897</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Sat, 13 Jun 2009 09:12:52 GMT</pubDate></item><item><title><![CDATA[Reply to delete auf ein Vectorelement on Sat, 13 Jun 2009 10:23:09 GMT]]></title><description><![CDATA[<p>ja.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1725914</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1725914</guid><dc:creator><![CDATA[phlox81]]></dc:creator><pubDate>Sat, 13 Jun 2009 10:23:09 GMT</pubDate></item></channel></rss>