<?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[remove() in list]]></title><description><![CDATA[<p>hallo,</p>
<p>ich bekomme in folgendem code bei remove() einen speicherzugriffsfehler. ich grueble jetzt seit zwei tagen und kann ihn mir einfach nicht erklaeren, da ich bei einem fehler in meinen datentypen ja garnicht bis zum remove kommen wuerde.</p>
<pre><code class="language-cpp">for (it=adjacency[i][k][b].begin();it!=adjacency[i][k][b].end();++it)
	if (characteristics[*it][0]!=genderselect)
		adjacency[i][k][b].remove(*it);
</code></pre>
<p>ich vermute, mehr muss ich garnicht posten da der fehler erst beim remove kommt (mit valgrind getestet). ich hab natuerlich auch unterwegs die daten angeschaut und wenn er bei reomeve abbricht stimmt alles, nur macht er es eben nicht.</p>
<p>hat einer eine idee? kann mir jemand helfen? da waere ich dankbar!<br />
salma</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/250865/remove-in-list</link><generator>RSS for Node</generator><lastBuildDate>Tue, 15 Sep 2026 19:46:10 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/250865.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 25 Sep 2009 12:25:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to remove() in list on Fri, 25 Sep 2009 12:25:05 GMT]]></title><description><![CDATA[<p>hallo,</p>
<p>ich bekomme in folgendem code bei remove() einen speicherzugriffsfehler. ich grueble jetzt seit zwei tagen und kann ihn mir einfach nicht erklaeren, da ich bei einem fehler in meinen datentypen ja garnicht bis zum remove kommen wuerde.</p>
<pre><code class="language-cpp">for (it=adjacency[i][k][b].begin();it!=adjacency[i][k][b].end();++it)
	if (characteristics[*it][0]!=genderselect)
		adjacency[i][k][b].remove(*it);
</code></pre>
<p>ich vermute, mehr muss ich garnicht posten da der fehler erst beim remove kommt (mit valgrind getestet). ich hab natuerlich auch unterwegs die daten angeschaut und wenn er bei reomeve abbricht stimmt alles, nur macht er es eben nicht.</p>
<p>hat einer eine idee? kann mir jemand helfen? da waere ich dankbar!<br />
salma</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1784120</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1784120</guid><dc:creator><![CDATA[salma]]></dc:creator><pubDate>Fri, 25 Sep 2009 12:25:05 GMT</pubDate></item><item><title><![CDATA[Reply to remove() in list on Fri, 25 Sep 2009 12:30:02 GMT]]></title><description><![CDATA[<p>Du machst deine Iteratoren ungültig, indem du möglicherweise Objekte löschst, auf die Iteratoren noch zeigen. Bist du sicher, dass du <code>remove()</code> und nicht <code>erase()</code> willst? Unterschied siehe <a href="http://www.cplusplus.com" rel="nofollow">www.cplusplus.com</a>. Denn <code>remove()</code> in Iterationsschleifen ist recht ungewöhnlich, bedenkt man, dass die Funktion selbst alle Elemente in einer Schleife prüft. Bei <code>erase()</code> hast du einen Rückgabetypen, den du deiner Iterator-Laufvariable zuweisen kannst, um sicher weiterzuiterieren.</p>
<p>Abgesehen davon:</p>
<p>salma schrieb:</p>
<blockquote>
<p>[...] und kann ihn mir einfach nicht erklaeren, da ich bei einem fehler in meinen datentypen ja garnicht bis zum remove kommen wuerde.</p>
</blockquote>
<p>Was führt dich zu diesem Fehlschluss? Je nach Art des Fehlers kann undefiniertes Verhalten entstehen, dass sich erst viel später manifestiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1784125</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1784125</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 25 Sep 2009 12:30:02 GMT</pubDate></item><item><title><![CDATA[Reply to remove() in list on Fri, 25 Sep 2009 12:39:12 GMT]]></title><description><![CDATA[<p>Welche Art Container ist adjacency[i][k][b] überhaupt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1784136</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1784136</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 25 Sep 2009 12:39:12 GMT</pubDate></item><item><title><![CDATA[Reply to remove() in list on Fri, 25 Sep 2009 12:41:09 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Welche Art Container ist adjacency[i][k][b] überhaupt?</p>
</blockquote>
<p>Dem Titel nach <code>std::list</code> . Aber ich mag es auch nicht, wenn wichtige Informationen nur durch den Titel mitgeteilt werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1784139</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1784139</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 25 Sep 2009 12:41:09 GMT</pubDate></item><item><title><![CDATA[Reply to remove() in list on Fri, 25 Sep 2009 12:56:44 GMT]]></title><description><![CDATA[<p>müsste also</p>
<pre><code class="language-cpp">adjacency[i][k][b].remove(*it--);
</code></pre>
<p>heißen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1784150</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1784150</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 25 Sep 2009 12:56:44 GMT</pubDate></item><item><title><![CDATA[Reply to remove() in list on Fri, 25 Sep 2009 13:01:51 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>müsste also</p>
<pre><code class="language-cpp">adjacency[i][k][b].remove(*it--);
</code></pre>
<p>heißen</p>
</blockquote>
<p>Aber <code>remove()</code> löscht ja alle Elemente, die gleich mit dem übergebenen Wert sind, und nicht nur ein einzelnes Element. Von daher kann es doch auch sein, dass das Element, auf welches <code>it</code> gerade verweist, gelöscht wird und <code>it</code> folglich ungültig wird. Ausserdem ist die Dekrementierung nicht gut, wenn <code>it</code> auf <code>begin()</code> zeigt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1784154</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1784154</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 25 Sep 2009 13:01:51 GMT</pubDate></item><item><title><![CDATA[Reply to remove() in list on Fri, 25 Sep 2009 13:16:55 GMT]]></title><description><![CDATA[<p>Wieso nicht einfach so:</p>
<pre><code class="language-cpp">for (it = adjacency[i][k][b].begin(); it != adjacency[i][k][b].end(); )
{
  if(characteristics[*it][0] != genderselect)
    it = adjacency[i][k][b].erase(it);
  else
    ++it;
}
</code></pre>
<p>allerdings sieht das noch immer ein wenig hässlich aus : D</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1784169</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1784169</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 25 Sep 2009 13:16:55 GMT</pubDate></item><item><title><![CDATA[Reply to remove() in list on Fri, 25 Sep 2009 13:57:42 GMT]]></title><description><![CDATA[<p>oh, da ist ja jetzt schon einiges aufgelaufen. erstmal vielen dank und entschuldigung, dass ich den container vergessen hatte.</p>
<p>die sache mit den iteratoren hatte ich soweit noch nicht durchstiegen, das hilft mir sehr.<br />
aber (und es ist mir ein wenig peinlich), wenn ich erase() verwende sagt der compiler:<br />
`</p>
<p>no matching function for call to ‘std::list&lt;int, std::allocator&lt;int&gt; &gt;::erase(std::_List_const_iterator&lt;int&gt;&amp;)’</p>
<p>`</p>
<p>wieso kennt er erase() nicht? ich kompiliere mit g++<br />
`</p>
<p>gcc version 4.3.3 (Ubuntu 4.3.3-5ubuntu4)</p>
<p>`</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12954">@nexus</a>:</p>
<blockquote>
<p>Was führt dich zu diesem Fehlschluss? Je nach Art des Fehlers kann undefiniertes Verhalten entstehen, dass sich erst viel später manifestiert.</p>
</blockquote>
<p>naja, ich bin davon ausgegangen, dass, wenn valgrind sagt, der fehler ist an dieser stelle, dann ist er auch da. stimmt das nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1784191</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1784191</guid><dc:creator><![CDATA[salma]]></dc:creator><pubDate>Fri, 25 Sep 2009 13:57:42 GMT</pubDate></item><item><title><![CDATA[Reply to remove() in list on Fri, 25 Sep 2009 14:10:02 GMT]]></title><description><![CDATA[<p>ich hab noch eine verstaendnisfrage:</p>
<p>wenn ich es jetzt also so mache, wie ich anfangs beschrieben habe, dann muesste das programm also einen listeneintrag ueberspringen.<br />
sprich ich habe z.b. eine liste mit (1 2 3 4). der iterator zeigt auf 2. ich loesche zwei, die eintraege springen eins nach vorn und der gleiche iterator zeigt dann auf 3 wird aber beim naechsten durchlauf noch um eins ehoeht.<br />
kann man das so sagen?<br />
das duerfte dann aber doch keinen zugriffsfehler erzeugen?</p>
<p>viele gruesse<br />
salma</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1784198</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1784198</guid><dc:creator><![CDATA[salma]]></dc:creator><pubDate>Fri, 25 Sep 2009 14:10:02 GMT</pubDate></item><item><title><![CDATA[Reply to remove() in list on Fri, 25 Sep 2009 14:21:07 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Aber remove() löscht ja alle Elemente, die gleich mit dem übergebenen Wert sind, und nicht nur ein einzelnes Element. Von daher kann es doch auch sein, dass das Element, auf welches it gerade verweist, gelöscht wird und it folglich ungültig wird. Ausserdem ist die Dekrementierung nicht gut, wenn it auf begin() zeigt.</p>
</blockquote>
<p>Das vorherige Element wäre schon gelöscht worden, wenn es ein Löschkandidat wäre. Denn Fall it==begin() hatte ich allerdings nicht bedacht.</p>
<p>salma schrieb:</p>
<blockquote>
<p>no matching function for call to ‘std::list&lt;int, std::allocator&lt;int&gt; &gt;::erase(std::_List_const_iterator&lt;int&gt;&amp;)’</p>
</blockquote>
<p>Ein normaler statt eines const_iterator muss es sein.</p>
<blockquote>
<p>wenn ich es jetzt also so mache, wie ich anfangs beschrieben habe, dann muesste das programm also einen listeneintrag ueberspringen.<br />
sprich ich habe z.b. eine liste mit (1 2 3 4). der iterator zeigt auf 2. ich loesche zwei, die eintraege springen eins nach vorn und der gleiche iterator zeigt dann auf 3 wird aber beim naechsten durchlauf noch um eins ehoeht.<br />
kann man das so sagen?</p>
</blockquote>
<p>nein. Ein einzelner Iterator verweist auf ein bestimmtes Element. Wird das Element vernichtet, wird der entsprechende Iterator ungültig. Mit einem ungültigen Iterator kann man gar nichts machen, schon gar nicht ihn inkrementieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1784204</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1784204</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 25 Sep 2009 14:21:07 GMT</pubDate></item><item><title><![CDATA[Reply to remove() in list on Fri, 25 Sep 2009 14:50:12 GMT]]></title><description><![CDATA[<p>vielen dank euch dreien, das hat mir sehr geholfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1784223</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1784223</guid><dc:creator><![CDATA[salma]]></dc:creator><pubDate>Fri, 25 Sep 2009 14:50:12 GMT</pubDate></item></channel></rss>