<?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[Vector Erase Iterator Outside Range]]></title><description><![CDATA[<pre><code class="language-cpp">std::vector&lt;unsigned char*&gt; ImgData;
</code></pre>
<pre><code class="language-cpp">void imageStorageClass::setImage(unsigned char* imgData)
{

	// Nach 5 Bilder im Puffer wird das älteste [0] verworfen und das neuste [4] hinten rangehängt (FIFO Prinzip)
	if((int)this-&gt;ImgData.size() == 5)
	{
		delete [] ImgData[0];	
		ImgData.erase(ImgData.begin());  //DEBUG ASSERTATION FAILED;
		this-&gt;currentImage = this-&gt;ImgData[(int)this-&gt;ImgData.size()-1];
		this-&gt;lastImage = this-&gt;ImgData[(int)this-&gt;ImgData.size()-2];
	}
	else
	{
		this-&gt;ImgData.push_back(imgData);
		this-&gt;currentImage = this-&gt;ImgData[(int)this-&gt;ImgData.size()-1];
		if((int)this-&gt;ImgData.size() &gt; 1)
		{this-&gt;lastImage = this-&gt;ImgData[(int)this-&gt;ImgData.size()-2];}
		else
		{this-&gt;lastImage = this-&gt;currentImage;}
	}
	this-&gt;TotalImageSaved++;

}
</code></pre>
<p>Hi, ich habe eine komisches Problem und weiß mir nicht mehr zu helfen.<br />
Ich entwickle derzeit ein Programm welches einen Bildstream codiert. Dazu habe ich einen Vector eingerichtet der mir die Speicheradressen zu den letzten 5 Bilder speichert. Wenn 5 Bilder im Vector sind soll immer das älteste gelöscht werden und das neueste wird hinzugefügt.</p>
<p>Das Speicher frei geben funktioniert noch einwandfrei, wenn ich aber darauf hin den Befehl ImgData.erase(ImgData.begin()); aufrufe, bekomme ich eine Debug Assertation Failed meldung.</p>
<p>Woran kann das liegen? Im Release Modus funktioniert das ohne Fehlermeldung. Aber es muss ja einen Grund geben, warum das so ist.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/295331/vector-erase-iterator-outside-range</link><generator>RSS for Node</generator><lastBuildDate>Sat, 15 Aug 2026 11:15:25 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/295331.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 11 Nov 2011 13:51:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Vector Erase Iterator Outside Range on Fri, 11 Nov 2011 13:51:09 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">std::vector&lt;unsigned char*&gt; ImgData;
</code></pre>
<pre><code class="language-cpp">void imageStorageClass::setImage(unsigned char* imgData)
{

	// Nach 5 Bilder im Puffer wird das älteste [0] verworfen und das neuste [4] hinten rangehängt (FIFO Prinzip)
	if((int)this-&gt;ImgData.size() == 5)
	{
		delete [] ImgData[0];	
		ImgData.erase(ImgData.begin());  //DEBUG ASSERTATION FAILED;
		this-&gt;currentImage = this-&gt;ImgData[(int)this-&gt;ImgData.size()-1];
		this-&gt;lastImage = this-&gt;ImgData[(int)this-&gt;ImgData.size()-2];
	}
	else
	{
		this-&gt;ImgData.push_back(imgData);
		this-&gt;currentImage = this-&gt;ImgData[(int)this-&gt;ImgData.size()-1];
		if((int)this-&gt;ImgData.size() &gt; 1)
		{this-&gt;lastImage = this-&gt;ImgData[(int)this-&gt;ImgData.size()-2];}
		else
		{this-&gt;lastImage = this-&gt;currentImage;}
	}
	this-&gt;TotalImageSaved++;

}
</code></pre>
<p>Hi, ich habe eine komisches Problem und weiß mir nicht mehr zu helfen.<br />
Ich entwickle derzeit ein Programm welches einen Bildstream codiert. Dazu habe ich einen Vector eingerichtet der mir die Speicheradressen zu den letzten 5 Bilder speichert. Wenn 5 Bilder im Vector sind soll immer das älteste gelöscht werden und das neueste wird hinzugefügt.</p>
<p>Das Speicher frei geben funktioniert noch einwandfrei, wenn ich aber darauf hin den Befehl ImgData.erase(ImgData.begin()); aufrufe, bekomme ich eine Debug Assertation Failed meldung.</p>
<p>Woran kann das liegen? Im Release Modus funktioniert das ohne Fehlermeldung. Aber es muss ja einen Grund geben, warum das so ist.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2143273</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2143273</guid><dc:creator><![CDATA[teddds]]></dc:creator><pubDate>Fri, 11 Nov 2011 13:51:09 GMT</pubDate></item><item><title><![CDATA[Reply to Vector Erase Iterator Outside Range on Fri, 11 Nov 2011 14:20:00 GMT]]></title><description><![CDATA[<p>Das kann irgendwie nicht sein. Kannst du ein minimales, compilierbares Beispiel produzieren, an dem man das nachvollziehen kann? Dass die Assertion nur im Debugmodus geworfen wird liegt übrigens da dran, dass es der Debugmodus ist <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="🙂"
    /> . Das ist ja gerade der Punkt, dass dort Assertions aktiviert sind, im Releasemodus wird dein Programm stillschweigend Fehler machen und vielleicht später abstürzen, vielleicht auch nicht, ist halt undefiniertes Verhalten.</p>
<p>Was allgemein auffällt:<br />
Was sollen die ganzen C-Casts oder allgemein die Casts? Dadurch provozierst du gerade zu, dass Fehler im Code vom Compiler nicht entdeckt werden. Vielleicht hast du auf diese Weise einen Fehler an früherer Stelle verdeckt.<br />
Was sollten die ganzen this-&gt; ?<br />
Wenn man new[] oder delete[] benutzt, dann macht man etwas falsch. new und delete mag man manchmal ja noch brauchen, aber dynamische Arrays braucht man in C++ nun wirklich nie von Hand machen. Das provoziert auch nur Fehler. Eventuell ist dein Fehler auch darauf zurück zu führen.</p>
<p>Wenn ich wetten müsste, würde ich auf Fehler bei deiner unnötigen manuellen Speicherverwaltung setzen. Das darauf folgende undefinierte Verhalten hat manchmal so lustige Folgen wie diese hier.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2143290</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2143290</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 11 Nov 2011 14:20:00 GMT</pubDate></item><item><title><![CDATA[Reply to Vector Erase Iterator Outside Range on Fri, 11 Nov 2011 15:00:49 GMT]]></title><description><![CDATA[<p>Danke für die schnelle Hilfe.</p>
<p>Ich habe jetzt mal ein kleines Programm geschrieben das genau das macht, was das große auch soll. Und komischer weiße funktioniert es dort mit der Speicherung und löschung genauso wie es soll. Dabei habe ich nix an meine ImageStorage Class geändert.</p>
<p>Die Cast sind/waren nur da um die Compilerwarnungen bei der Typkonvertierung zu vermeiden. Allerdings werden die Warnungen bei dem Testprogramm auch nicht mehr angezeigt. Die this-&gt; Pointer ruf ich auf damit ich auf dem 1. Blick sehe welche Variable global und welche lokal ist in der jeweiligen klasse.</p>
<p>Ist dieses Verhalten den verkehrt?</p>
<blockquote>
<p>Wenn man new[] oder delete[] benutzt, dann macht man etwas falsch. new und delete mag man manchmal ja noch brauchen, aber dynamische Arrays braucht man in C++ nun wirklich nie von Hand machen. Das provoziert auch nur Fehler.</p>
</blockquote>
<p>Wenn ich ein Speicher für mein Bild reserviere mache ich das so:</p>
<pre><code class="language-cpp">unsigned char* tmp = new unsigned char[IMG_ROWS*IMG_COLS];
</code></pre>
<p>und das ganze gebe ich doch dann wieder mit</p>
<pre><code class="language-cpp">delete [] tmp;
</code></pre>
<p>frei oder ist das vekehrt?</p>
<p>Ich suche jetzt das andere Programm nach dem Fehler ab <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
Wünscht mir Glück <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2143306</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2143306</guid><dc:creator><![CDATA[teddds]]></dc:creator><pubDate>Fri, 11 Nov 2011 15:00:49 GMT</pubDate></item><item><title><![CDATA[Reply to Vector Erase Iterator Outside Range on Fri, 11 Nov 2011 15:08:46 GMT]]></title><description><![CDATA[<p>Wenn ein Compiler dich warnt, hat er im Allgemeinen Recht. Mit einem C-Cast dem Compiler zu sagen, dass er das Maul halten soll, ist ein gefährlicher Weg.</p>
<p>Deine Speicherverwaltung kann man nur am Gesamtprogramm als richtig oder falsch einschätzen. Es bleibt die Feststellung, dass new[] und delete[] äquivalent zur Nuztung eines vectors sind, bloß dass beim vector nichts schiefgehen <em>kann</em>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2143313</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2143313</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 11 Nov 2011 15:08:46 GMT</pubDate></item><item><title><![CDATA[Reply to Vector Erase Iterator Outside Range on Fri, 11 Nov 2011 15:13:14 GMT]]></title><description><![CDATA[<p>Warum nimmst du nicht einfach statt dessen ein</p>
<pre><code class="language-cpp">std::vector&lt;std::vector&lt;unsigned char&gt; &gt; ImgData;
</code></pre>
<p>Dann fällt das ganze new und delete flach.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2143316</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2143316</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Fri, 11 Nov 2011 15:13:14 GMT</pubDate></item><item><title><![CDATA[Reply to Vector Erase Iterator Outside Range on Sat, 12 Nov 2011 12:00:04 GMT]]></title><description><![CDATA[<p>Sofern du nicht häufig einzelne Zeilen oder Spalten entfernst, würde ich einen <strong>ein</strong>dimensionalen Vektor nehmen und eine Funktion für 2D-Zugriff schreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2143655</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2143655</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 12 Nov 2011 12:00:04 GMT</pubDate></item></channel></rss>