<?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::list::iterator Gültigkeitsfrage.]]></title><description><![CDATA[<p>Ich hab in einem meiner Programme gerade einen Bug und hab ihn auf ein<br />
eine etwas unsaubere Stelle im Code zurückgeführt.</p>
<p><strong>1</strong> Ich habe eine std::list, aus dieser Liste entferne ich ein Objekt<br />
behalte jedoch den Iterator der auf das Objekt verwies!<br />
old = *old_it;<br />
old_it = path.erase(old_it);</p>
<p><strong>2</strong> Danach füge ich es wieder in die Liste ein.<br />
old_it = path.insert(old_it,old);<br />
Bis hierhin sollte eigentlich noch alles stimmen</p>
<p><strong>3</strong> Jetzt lösche ich ein anderes Objekt aus der Liste (z.B. das direkt dahinter)<br />
act = *it;<br />
it = path.erase(it);</p>
<p><strong>4</strong> Nun lösche ich das Alte wieder <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /><br />
old_it = path.erase(old_it);</p>
<p><strong>5</strong> Und füge das andere Objekt wieder ein<br />
it = path.insert(it,act);</p>
<p>Ich habe die Vermutung das bei diesem Vorgang einer der beiden Iteratoren ungültig wird.<br />
D.h. wenn ich den Alten wieder lösche, der Iterator des Anderen Objektes ungültig wird.</p>
<p>Der Bug macht sich übrigens in einer Endlosschleife bemerkbar. Der Schleifenkopf ist dabei:<br />
for(it=path.begin(); it != path.end(); it++)</p>
<p>Ich weis das Alles ist etwas komplex, aber vllt. macht sich ja jemand<br />
die Mühe sich da kurz reinzudenken. Mir wäre auch schon geholfen wenn jemand<br />
sagt, ja der Iterator wird definitv ungültig, dann kann ich den Ganzen<br />
Ansatz gleich verwerfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/202294/std-list-iterator-gültigkeitsfrage</link><generator>RSS for Node</generator><lastBuildDate>Tue, 06 Oct 2026 16:58:16 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/202294.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 09 Jan 2008 17:27:51 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::list::iterator Gültigkeitsfrage. on Wed, 09 Jan 2008 17:27:51 GMT]]></title><description><![CDATA[<p>Ich hab in einem meiner Programme gerade einen Bug und hab ihn auf ein<br />
eine etwas unsaubere Stelle im Code zurückgeführt.</p>
<p><strong>1</strong> Ich habe eine std::list, aus dieser Liste entferne ich ein Objekt<br />
behalte jedoch den Iterator der auf das Objekt verwies!<br />
old = *old_it;<br />
old_it = path.erase(old_it);</p>
<p><strong>2</strong> Danach füge ich es wieder in die Liste ein.<br />
old_it = path.insert(old_it,old);<br />
Bis hierhin sollte eigentlich noch alles stimmen</p>
<p><strong>3</strong> Jetzt lösche ich ein anderes Objekt aus der Liste (z.B. das direkt dahinter)<br />
act = *it;<br />
it = path.erase(it);</p>
<p><strong>4</strong> Nun lösche ich das Alte wieder <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /><br />
old_it = path.erase(old_it);</p>
<p><strong>5</strong> Und füge das andere Objekt wieder ein<br />
it = path.insert(it,act);</p>
<p>Ich habe die Vermutung das bei diesem Vorgang einer der beiden Iteratoren ungültig wird.<br />
D.h. wenn ich den Alten wieder lösche, der Iterator des Anderen Objektes ungültig wird.</p>
<p>Der Bug macht sich übrigens in einer Endlosschleife bemerkbar. Der Schleifenkopf ist dabei:<br />
for(it=path.begin(); it != path.end(); it++)</p>
<p>Ich weis das Alles ist etwas komplex, aber vllt. macht sich ja jemand<br />
die Mühe sich da kurz reinzudenken. Mir wäre auch schon geholfen wenn jemand<br />
sagt, ja der Iterator wird definitv ungültig, dann kann ich den Ganzen<br />
Ansatz gleich verwerfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1433833</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1433833</guid><dc:creator><![CDATA[Mario Sandler]]></dc:creator><pubDate>Wed, 09 Jan 2008 17:27:51 GMT</pubDate></item><item><title><![CDATA[Reply to std::list::iterator Gültigkeitsfrage. on Wed, 09 Jan 2008 18:09:54 GMT]]></title><description><![CDATA[<p>Hmm erase gibt dir den Iterator für das nächste Item in der Liste zurück.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1433856</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1433856</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Wed, 09 Jan 2008 18:09:54 GMT</pubDate></item><item><title><![CDATA[Reply to std::list::iterator Gültigkeitsfrage. on Wed, 09 Jan 2008 19:02:10 GMT]]></title><description><![CDATA[<p>poste doch mal deinen quelltext, dann kann man dir vielleicht erzählen was sich genau abspielt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1433878</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1433878</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 09 Jan 2008 19:02:10 GMT</pubDate></item><item><title><![CDATA[Reply to std::list::iterator Gültigkeitsfrage. on Thu, 10 Jan 2008 01:11:39 GMT]]></title><description><![CDATA[<p>*glaskugel herauskram*</p>
<p><a href="http://Storm.Xapek.de" rel="nofollow">Storm.Xapek.de</a> schrieb:</p>
<blockquote>
<p><strong>1</strong> Ich habe eine std::list, aus dieser Liste entferne ich ein Objekt<br />
behalte jedoch den Iterator der auf das Objekt verwies!<br />
old = *old_it;<br />
old_it = path.erase(old_it);</p>
<p><strong>2</strong> Danach füge ich es wieder in die Liste ein.<br />
old_it = path.insert(old_it,old);<br />
Bis hierhin sollte eigentlich noch alles stimmen</p>
</blockquote>
<p>nö, du behältst nicht den iterator, auf den das element verwies. du behältst den wert ('old') und old_it zeigt nach dem erase des elements, auf das es zeigte, auf das element, das danach kommt.</p>
<blockquote>
<p><strong>3</strong> Jetzt lösche ich ein anderes Objekt aus der Liste (z.B. das direkt dahinter)<br />
act = *it;<br />
it = path.erase(it);</p>
</blockquote>
<p>aha, das ist das problem. das element, das direkt hinter dem gerade gelöschten kommt, ist das element, auf das old_it jetzt zeigt. erase invalidiert bei einer liste alle iteratoren auf das objekt, das gelöscht wird, damit zeigt old_it ab jetzt ins nirvana.</p>
<blockquote>
<p><strong>4</strong> Nun lösche ich das Alte wieder <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /><br />
old_it = path.erase(old_it);</p>
</blockquote>
<p>und einen iterator, der ungültig ist, zu verwenden, fliegt dir um die ohren.</p>
<blockquote>
<p><strong>5</strong> Und füge das andere Objekt wieder ein<br />
it = path.insert(it,act);</p>
</blockquote>
<p>soweit kommt's wahrscheinlich gar nicht.</p>
<p>std::list::erase invalidiert wie gesagt nur die iteratoren, die auf das gelöschte element zeigen. es lässt alle anderen unberührt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1434061</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1434061</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Thu, 10 Jan 2008 01:11:39 GMT</pubDate></item><item><title><![CDATA[Reply to std::list::iterator Gültigkeitsfrage. on Fri, 11 Jan 2008 21:43:06 GMT]]></title><description><![CDATA[<p>Danke fürs durchlesen und für die Antworten.<br />
Ich habe den Ansatz inzwischen doch ganz verworfen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1435154</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1435154</guid><dc:creator><![CDATA[Mario Sandler]]></dc:creator><pubDate>Fri, 11 Jan 2008 21:43:06 GMT</pubDate></item></channel></rss>