<?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[Speicherprobleme beim clear()&#x27;en und delete&#x27;n einer STL Map]]></title><description><![CDATA[<p>Hi allerseits.</p>
<p>Ich stolpere bereits seit einigen Tagen über ein Problem, welches mich leider erfolgreich davon abhält an meinem aktuellen Projekt, einer kleinen 3D Engine, weiterarbeiten zu können.</p>
<p>Im Speziellen geht es dabei um einen, im Importer/Converter für .obj-3D-Modellfiles auftretenden, Speicherfehler, den ich beim Versuch bekomme, eine vorher angelegte STL-Map zu leeren oder zu deallokieren.</p>
<p>Auf wesentliche Grundzüge beschränkt, lautet der betreffende Code in etwa folgendermaßen:</p>
<pre><code class="language-cpp">bool WaveformModel::loadModelData( const char *filename )
{
	[ ... ]

	std::map&lt;string, unsigned short&gt; *mtl_map = new std::map&lt;string, unsigned short&gt;;

	// initialise and read materials from material lib
	if (!initMtlLib(mtl_map))
	{
		error = 2;
		return false;
	}

	// start reading
	ptr = filestart;

	while ( ptr[0] != '\0')
	{
		[ ... ]

		else if ( equalSubstrings(ptr, &quot;usemtl &quot;, 7))
		{
			skipToNextArg();

			int len = 0;
			for(len = 0; ptr[len] != '\t' &amp;&amp; ptr[len] != ' ' &amp;&amp; ptr[len] != '\n' &amp;&amp; ptr[len] != '\0'; len++);
			string mtl_name(ptr, len);

			m_pMeshes[curMesh].m_materialIndex = (*mtl_map)[mtl_name];
		}

		[ ... ]
	}

	//mtl_map-&gt;clear();
	delete mtl_map; // absturz!!
</code></pre>
<p>Die aufgerufene Funktion <strong>initMtlLib</strong>:</p>
<pre><code class="language-cpp">bool WaveformModel::initMtlLib(std::map&lt;string, unsigned short&gt; *mtl_map)
{
	[ ... ]
	ptr = buffer;
	// read data
	while ( ptr[0] != '\0')
	{
		// skip commentaries
		if ( ptr[0] == '#')
			skipToNextLine();

		// read material names
		else if ( equalSubstrings(ptr, &quot;newmtl &quot;, 7))
		{
			skipToNextArg();
			// determine length of filename
			for(len = 0; ptr[len] != '\n' &amp;&amp; ptr[len] != '\0'; len++);

			string mtl_name(ptr, len);
			(*mtl_map)[mtl_name] = cur_mtl;
			cur_mtl++;

			skipToNextLine();
		}
		[ ... ]
	}

	return true;
</code></pre>
<p>Grund des Fehlers ist eine fehlgeschlagende Debug Assertion in der Funktion <strong>_CrtIsValidHeapPointer(pUserData)</strong> in der <strong>dbgheap.c</strong>.</p>
<p>Der Absturz tritt auf, sobald ich mtl_map-&gt;clear(); oder delete mtl_map; aufrufe. Auch mit automatischer Speicherverwaltung, ohne dynamisch über den Zeiger allokierten Memory stürzt das Programm ab, dann beim verlassen der loadModelData() Funktion, wo der Gültigkeitsbereich von mtl_map verlassen und das Objekt freigegeben wird.<br />
Auch eine Behandlung der mtl_map als Klassenmember führte zum gleichen Fehler.<br />
Die Map nimmt alle Werte die ihr zugewiesen wurden richtig auf, auch der Zugriff funktioniert. Die Adresse scheint gültig zu sein und stimmt am Ende mit der zu Beginn überein.<br />
Die einzige, inakzeptable, Möglichkeit die ich gefunden habe den Absturz zu unterdrücken ist die Auskommentierung des Zugriffs auf mtl_map in der initMtlLib-Funktion.</p>
<p>Leider bin ich mit meinem Latein hier wirklich ziemlich am Ende, und dieser Fehler beschäftigt und frustriert mich schon mehrere Tage.<br />
Also wenn jemand etwas Zeit hätte sich das mal anzuschauen und vllt. eine Idee was hier schiefläuft, wäre ich sehr dankbar.</p>
<p>Kompilieren tue ich es, falls das von Belang sein sollte, unter MS VS05. Unter Linux tritt derselbe Fehler jedoch auch auf.</p>
<p>Falls genauere Informationen über den Code benötigt werden, habe ich hier die Quell- und Headerdatei nochmal komplett verlinkt. Ansonsten bitte nochmal Rückfragen falls Teile nicht verstanden werden o.ä..</p>
<p><a href="http://www.baseoftrash.de/WaveformModel.cpp" rel="nofollow">http://www.baseoftrash.de/WaveformModel.cpp</a><br />
<a href="http://www.baseoftrash.de/WaveformModel.h" rel="nofollow">http://www.baseoftrash.de/WaveformModel.h</a></p>
<p>Danke. <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="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/204453/speicherprobleme-beim-clear-en-und-delete-n-einer-stl-map</link><generator>RSS for Node</generator><lastBuildDate>Thu, 08 Oct 2026 15:26:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/204453.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 03 Feb 2008 16:00:47 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Speicherprobleme beim clear()&#x27;en und delete&#x27;n einer STL Map on Sun, 03 Feb 2008 16:00:47 GMT]]></title><description><![CDATA[<p>Hi allerseits.</p>
<p>Ich stolpere bereits seit einigen Tagen über ein Problem, welches mich leider erfolgreich davon abhält an meinem aktuellen Projekt, einer kleinen 3D Engine, weiterarbeiten zu können.</p>
<p>Im Speziellen geht es dabei um einen, im Importer/Converter für .obj-3D-Modellfiles auftretenden, Speicherfehler, den ich beim Versuch bekomme, eine vorher angelegte STL-Map zu leeren oder zu deallokieren.</p>
<p>Auf wesentliche Grundzüge beschränkt, lautet der betreffende Code in etwa folgendermaßen:</p>
<pre><code class="language-cpp">bool WaveformModel::loadModelData( const char *filename )
{
	[ ... ]

	std::map&lt;string, unsigned short&gt; *mtl_map = new std::map&lt;string, unsigned short&gt;;

	// initialise and read materials from material lib
	if (!initMtlLib(mtl_map))
	{
		error = 2;
		return false;
	}

	// start reading
	ptr = filestart;

	while ( ptr[0] != '\0')
	{
		[ ... ]

		else if ( equalSubstrings(ptr, &quot;usemtl &quot;, 7))
		{
			skipToNextArg();

			int len = 0;
			for(len = 0; ptr[len] != '\t' &amp;&amp; ptr[len] != ' ' &amp;&amp; ptr[len] != '\n' &amp;&amp; ptr[len] != '\0'; len++);
			string mtl_name(ptr, len);

			m_pMeshes[curMesh].m_materialIndex = (*mtl_map)[mtl_name];
		}

		[ ... ]
	}

	//mtl_map-&gt;clear();
	delete mtl_map; // absturz!!
</code></pre>
<p>Die aufgerufene Funktion <strong>initMtlLib</strong>:</p>
<pre><code class="language-cpp">bool WaveformModel::initMtlLib(std::map&lt;string, unsigned short&gt; *mtl_map)
{
	[ ... ]
	ptr = buffer;
	// read data
	while ( ptr[0] != '\0')
	{
		// skip commentaries
		if ( ptr[0] == '#')
			skipToNextLine();

		// read material names
		else if ( equalSubstrings(ptr, &quot;newmtl &quot;, 7))
		{
			skipToNextArg();
			// determine length of filename
			for(len = 0; ptr[len] != '\n' &amp;&amp; ptr[len] != '\0'; len++);

			string mtl_name(ptr, len);
			(*mtl_map)[mtl_name] = cur_mtl;
			cur_mtl++;

			skipToNextLine();
		}
		[ ... ]
	}

	return true;
</code></pre>
<p>Grund des Fehlers ist eine fehlgeschlagende Debug Assertion in der Funktion <strong>_CrtIsValidHeapPointer(pUserData)</strong> in der <strong>dbgheap.c</strong>.</p>
<p>Der Absturz tritt auf, sobald ich mtl_map-&gt;clear(); oder delete mtl_map; aufrufe. Auch mit automatischer Speicherverwaltung, ohne dynamisch über den Zeiger allokierten Memory stürzt das Programm ab, dann beim verlassen der loadModelData() Funktion, wo der Gültigkeitsbereich von mtl_map verlassen und das Objekt freigegeben wird.<br />
Auch eine Behandlung der mtl_map als Klassenmember führte zum gleichen Fehler.<br />
Die Map nimmt alle Werte die ihr zugewiesen wurden richtig auf, auch der Zugriff funktioniert. Die Adresse scheint gültig zu sein und stimmt am Ende mit der zu Beginn überein.<br />
Die einzige, inakzeptable, Möglichkeit die ich gefunden habe den Absturz zu unterdrücken ist die Auskommentierung des Zugriffs auf mtl_map in der initMtlLib-Funktion.</p>
<p>Leider bin ich mit meinem Latein hier wirklich ziemlich am Ende, und dieser Fehler beschäftigt und frustriert mich schon mehrere Tage.<br />
Also wenn jemand etwas Zeit hätte sich das mal anzuschauen und vllt. eine Idee was hier schiefläuft, wäre ich sehr dankbar.</p>
<p>Kompilieren tue ich es, falls das von Belang sein sollte, unter MS VS05. Unter Linux tritt derselbe Fehler jedoch auch auf.</p>
<p>Falls genauere Informationen über den Code benötigt werden, habe ich hier die Quell- und Headerdatei nochmal komplett verlinkt. Ansonsten bitte nochmal Rückfragen falls Teile nicht verstanden werden o.ä..</p>
<p><a href="http://www.baseoftrash.de/WaveformModel.cpp" rel="nofollow">http://www.baseoftrash.de/WaveformModel.cpp</a><br />
<a href="http://www.baseoftrash.de/WaveformModel.h" rel="nofollow">http://www.baseoftrash.de/WaveformModel.h</a></p>
<p>Danke. <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="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1448557</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1448557</guid><dc:creator><![CDATA[hasu]]></dc:creator><pubDate>Sun, 03 Feb 2008 16:00:47 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherprobleme beim clear()&#x27;en und delete&#x27;n einer STL Map on Sun, 03 Feb 2008 16:07:02 GMT]]></title><description><![CDATA[<p>Machst du vlt. irgendwe die strings in der map kaputt, so dass sie nicht mehr richtig frei gegeben werden können?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1448564</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1448564</guid><dc:creator><![CDATA[Der hmmm]]></dc:creator><pubDate>Sun, 03 Feb 2008 16:07:02 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherprobleme beim clear()&#x27;en und delete&#x27;n einer STL Map on Sun, 03 Feb 2008 16:42:42 GMT]]></title><description><![CDATA[<p>Würde mich sehr wundern.<br />
Auf die Map wird nur im angegebenen Code zugegriffen, einmal schreiben, einmal lesen. Kann mir nicht vorstellen, dass da was schiefgeht - zumal die Strings laut Debugger und Testausgabe richtig in der Map drinliegen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1448589</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1448589</guid><dc:creator><![CDATA[hasu]]></dc:creator><pubDate>Sun, 03 Feb 2008 16:42:42 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherprobleme beim clear()&#x27;en und delete&#x27;n einer STL Map on Sun, 03 Feb 2008 16:43:47 GMT]]></title><description><![CDATA[<p>Debug doch einfach mal das clear durch</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1448591</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1448591</guid><dc:creator><![CDATA[Der hmmm]]></dc:creator><pubDate>Sun, 03 Feb 2008 16:43:47 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherprobleme beim clear()&#x27;en und delete&#x27;n einer STL Map on Sun, 03 Feb 2008 16:45:04 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">string mtl_name(ptr, len);
			(*mtl_map)[mtl_name] = cur_mtl;
			cur_mtl++;
</code></pre>
<p>ich nehme mal an, dass newmtl jeweils die erste Zeile ist, dann ist aber cur_mtl anschließend beim Füllen um eins zu groß, beim letzten Element ist dann cur_mtl == m_numMaterials und du schreibst über die Array-Grenzen hinaus. Überhaupt sind hier zu wenige Prüfungen des Inputs vorhanden.</p>
<p>Es fällt noch auf:<br />
- Die Speicherreservierung ist inkonsistent: viele new(nothrow), nicht immer wird das Ergebnis geprüft (z.B. buffer, dort fehlt auch ein delete[]), aber vereinzelt auch normale news ohne Behandlung<br />
- keine Smartpointer, es dürften einige Lecks enthalten sein<br />
Es kann sinnvoll sein, die nothrow-news durch normale news zu ersetzen und den ganzen Funktionsinhalt in einen try-block zu verschieben. Zudem sollten die nackten Zeiger durch Smartpointer (am Besten scoped_array/scoped/ptr) ersetzt werden. Noch besser wäre ein Standardcontainer: z.B. vector für m_pMaterials</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1448592</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1448592</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 03 Feb 2008 16:45:04 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherprobleme beim clear()&#x27;en und delete&#x27;n einer STL Map on Sun, 03 Feb 2008 17:45:59 GMT]]></title><description><![CDATA[<p>Danke für eure Antworten erstmal.</p>
<p>@Der hmmm:<br />
Hab ich mal versucht, bin aber leider nicht wirklich schlau daraus geworden. Zumindest scheint der Fehler auch hier beim deleten der einzelnen Einträge aufzutereten</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6642">@camper</a>:</p>
<p>camper schrieb:</p>
<blockquote>
<p>ich nehme mal an, dass newmtl jeweils die erste Zeile ist, dann ist aber cur_mtl anschließend beim Füllen um eins zu groß, beim letzten Element ist dann cur_mtl == m_numMaterials und du schreibst über die Array-Grenzen hinaus. Überhaupt sind hier zu wenige Prüfungen des Inputs vorhanden.</p>
</blockquote>
<p>Verstehe nicht ganz worauf du hinauswillst.<br />
In einem Material-File können mehrere &quot;newmtl&quot; erzeugt werden. Über die Map bekommt das erste die ID 0 zugewiesen, cur_mtl wird erst danach inkrementiert. Daher schreibe ich auch nicht über die m_numMaterials hinaus.</p>
<p>Das der Input hier nicht groß geprüft wird stimmt natürlich, liegt größtenteils daran, dass ich die Modelle nur einmal durch diesen Converter jagen möchte und danach dann sowieso auf ein internes binäres Datenformat wechseln werde, welches schneller zu laden, rendern und kleiner zu speichern ist.<br />
Einige zusätzliche Warnungen etc. werden natürlich noch eingebaut, aber ich wollte zunächst mal die grundlegende Funktionalität herstellen.</p>
<blockquote>
<p>Es fällt noch auf:<br />
- Die Speicherreservierung ist inkonsistent: viele new(nothrow), nicht immer wird das Ergebnis geprüft (z.B. buffer, dort fehlt auch ein delete[]), aber vereinzelt auch normale news ohne Behandlung</p>
</blockquote>
<p>Ist in der Gesamtversion des Codes weitestgehend implementiert, auch das delete des buffers. Bei kleineren new-Anweisungen in der größe von wenigen Bytes habe ich mal auf das Fehlerabfangen verzichtet, wird dann ggf. auch noch eingebaut. Halte ich jetzt aber für nicht so zentral.</p>
<blockquote>
<p>- keine Smartpointer, es dürften einige Lecks enthalten sein<br />
Es kann sinnvoll sein, die nothrow-news durch normale news zu ersetzen und den ganzen Funktionsinhalt in einen try-block zu verschieben. Zudem sollten die nackten Zeiger durch Smartpointer (am Besten scoped_array/scoped/ptr) ersetzt werden. Noch besser wäre ein Standardcontainer: z.B. vector für m_pMaterials</p>
</blockquote>
<p>Den Begriff Smartpointer höre ich ehrlich gesagt zum ersten Mal. Werde mich dahingehend mal etwas umhören.<br />
Dass die Arrays mit den Daten jedoch herkömmliche dyn. Arrays sind hat einen recht simplen Grund: Nach Abschluss des Einlesens werden die in den Arrays stehenden Daten direkt in ein &quot;cooked&quot; Binärfile exportiert, um von dort aus später im Hauptprogramm wieder sehr schnell und platzsparend gelesen werden zu können - hierfür bietet sich eine Realisierung über vector m.E. nicht an.</p>
<p>Wirklich schlauer was meinen Fehler angeht bin ich aber leider immernoch nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1448634</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1448634</guid><dc:creator><![CDATA[hasu]]></dc:creator><pubDate>Sun, 03 Feb 2008 17:45:59 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherprobleme beim clear()&#x27;en und delete&#x27;n einer STL Map on Sun, 03 Feb 2008 17:51:41 GMT]]></title><description><![CDATA[<p>hasu schrieb:</p>
<blockquote>
<p>@Der hmmm:<br />
Hab ich mal versucht, bin aber leider nicht wirklich schlau daraus geworden. Zumindest scheint der Fehler auch hier beim deleten der einzelnen Einträge aufzutereten</p>
</blockquote>
<p>Spricht ja dafür, dass du irgendwas am string kaputt gemacht hast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1448636</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1448636</guid><dc:creator><![CDATA[Der hmmm]]></dc:creator><pubDate>Sun, 03 Feb 2008 17:51:41 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherprobleme beim clear()&#x27;en und delete&#x27;n einer STL Map on Sun, 03 Feb 2008 18:44:57 GMT]]></title><description><![CDATA[<p>hasu schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>ich nehme mal an, dass newmtl jeweils die erste Zeile ist, dann ist aber cur_mtl anschließend beim Füllen um eins zu groß, beim letzten Element ist dann cur_mtl == m_numMaterials und du schreibst über die Array-Grenzen hinaus. Überhaupt sind hier zu wenige Prüfungen des Inputs vorhanden.</p>
</blockquote>
<p>Verstehe nicht ganz worauf du hinauswillst.<br />
In einem Material-File können mehrere &quot;newmtl&quot; erzeugt werden. Über die Map bekommt das erste die ID 0 zugewiesen, cur_mtl wird erst danach inkrementiert. Daher schreibe ich auch nicht über die m_numMaterials hinaus.</p>
</blockquote>
<p>Es geht um die anderen Zugriffe, m_pMaterials[cur_mtl] - falls nach dem letzten &quot;newmtl&quot; noch eine Zeile kommt, die zu einem anderen if-Zweig gehört, greifst du per m_pMaterials[cur_mtl] logischerweise auf das Element hinter dem letzten des Arrays zu - also undefiniertes Verhalten. Deshalb meine Frage nach der Reihenfolge.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1448672</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1448672</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 03 Feb 2008 18:44:57 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherprobleme beim clear()&#x27;en und delete&#x27;n einer STL Map on Mon, 04 Feb 2008 00:00:55 GMT]]></title><description><![CDATA[<p>hmm, mal überlegen;<br />
aber dieser zugrif würde doch vor dem delete erfolgen. nun bin ich unsicher wie sich das auswirkt, aber theoretisch wäre doch so ein absturz dann beim zugriff auf einen undef. mem-bereich und nicht erst irgendwann wenn alles schon abgearbeitet ist und der speicher wieder freigegeben wird. aber hasu soll trotzdem mal eine überprüfung einbauen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1448833</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1448833</guid><dc:creator><![CDATA[dgrat]]></dc:creator><pubDate>Mon, 04 Feb 2008 00:00:55 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherprobleme beim clear()&#x27;en und delete&#x27;n einer STL Map on Mon, 04 Feb 2008 01:19:48 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Es geht um die anderen Zugriffe, m_pMaterials[cur_mtl] - falls nach dem letzten &quot;newmtl&quot; noch eine Zeile kommt, die zu einem anderen if-Zweig gehört, greifst du per m_pMaterials[cur_mtl] logischerweise auf das Element hinter dem letzten des Arrays zu - also undefiniertes Verhalten. Deshalb meine Frage nach der Reihenfolge.</p>
</blockquote>
<p>Ohje, verdammt, du hast Recht! Dieser blöde Fehler ist mir tatsächlich nicht aufgefallen und er war auch wirklich der Grund für den Absturz. Schwierig den Zusammenhang dann zu finden, wenn die Ursache ganz woanders liegt.</p>
<p>Vielen Dank für deine Hilfe!! <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="🙂"
    /></p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/26451">@dgrat</a>: Nicht zwangsläufig. Wenn ich Daten in mein m_pMaterial-Array reinschreibe, an eine Stelle für die gar kein Speicherplatz allokiert ist, schreibe ich ggf. irgendwelchen Unsinn in Speicherblöcke die danach folgen, wie hier eben die mtl_map.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1448838</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1448838</guid><dc:creator><![CDATA[hasu]]></dc:creator><pubDate>Mon, 04 Feb 2008 01:19:48 GMT</pubDate></item></channel></rss>