<?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[Problem mit regelmäßigem bad_alloc bei new]]></title><description><![CDATA[<p>Hallo,</p>
<p>erst einmal etwas Code:</p>
<pre><code>leaf-&gt;m_indices = new TVertexIndex[leaf-&gt;m_iNumQuads * 4];
</code></pre>
<p>Diese Code-Zeile wird rund 17.000 Mal durchlaufen und funktioniert. Ändere ich sie aber um in</p>
<pre><code>leaf-&gt;m_indices = new TVertexIndex[leaf-&gt;m_iNumQuads * [b][u]6[/u][/b&rsqb;&rsqb;;
</code></pre>
<p>so wird bei einem bestimmten Durchlauf (immer beim selben) ein bad_alloc geworfen.</p>
<p>Meine Frage ist nun, woran das liegen kann? Genug Arbeitsspeicher habe ich nämlich noch definitiv, wenn die Ausnahme geworfen wird.</p>
<p>Vielen Dank im Voraus,<br />
bin für jeden Hinweis dankbar <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/191450/problem-mit-regelmäßigem-bad_alloc-bei-new</link><generator>RSS for Node</generator><lastBuildDate>Sun, 27 Sep 2026 03:47:59 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/191450.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 03 Sep 2007 12:37:32 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit regelmäßigem bad_alloc bei new on Mon, 03 Sep 2007 12:39:22 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>erst einmal etwas Code:</p>
<pre><code>leaf-&gt;m_indices = new TVertexIndex[leaf-&gt;m_iNumQuads * 4];
</code></pre>
<p>Diese Code-Zeile wird rund 17.000 Mal durchlaufen und funktioniert. Ändere ich sie aber um in</p>
<pre><code>leaf-&gt;m_indices = new TVertexIndex[leaf-&gt;m_iNumQuads * [b][u]6[/u][/b&rsqb;&rsqb;;
</code></pre>
<p>so wird bei einem bestimmten Durchlauf (immer beim selben) ein bad_alloc geworfen.</p>
<p>Meine Frage ist nun, woran das liegen kann? Genug Arbeitsspeicher habe ich nämlich noch definitiv, wenn die Ausnahme geworfen wird.</p>
<p>Vielen Dank im Voraus,<br />
bin für jeden Hinweis dankbar <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/1357859</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1357859</guid><dc:creator><![CDATA[the*V*oid]]></dc:creator><pubDate>Mon, 03 Sep 2007 12:39:22 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit regelmäßigem bad_alloc bei new on Mon, 03 Sep 2007 12:41:46 GMT]]></title><description><![CDATA[<p>the[V]oid schrieb:</p>
<blockquote>
<p>Meine Frage ist nun, woran das liegen kann? Genug Arbeitsspeicher habe ich nämlich noch definitiv, wenn die Ausnahme geworfen wird.</p>
</blockquote>
<p>Wenn es nicht an zuwenig Speicher liegt, liegt es vermutlich an zuwenig Speicher am Stück.</p>
<p>Machst Du zwischendurch auch mal deletes? <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/1357863</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1357863</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Mon, 03 Sep 2007 12:41:46 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit regelmäßigem bad_alloc bei new on Mon, 03 Sep 2007 12:48:40 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ja, ich mache überall dort deletes, wo es geht, nur ist die Methode, in der diese Codezeile steht, eben dafür gedacht, einen ziemlich dicken Speicherbrocken zu generieren, der erst verarbeitet werden muss und erst dann entladen werden kann.</p>
<p>Was meinst du mit &quot;zuwenig Speicher am Stück&quot;?<br />
Wie könnte man probieren, das Problem in den Griff zu kriegen?</p>
<p>mfG!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1357867</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1357867</guid><dc:creator><![CDATA[the*V*oid]]></dc:creator><pubDate>Mon, 03 Sep 2007 12:48:40 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit regelmäßigem bad_alloc bei new on Mon, 03 Sep 2007 13:04:22 GMT]]></title><description><![CDATA[<p>Mit &quot;am Stück&quot; meine ich, dass wenn Du 500 MB frei hast, das auch 100 verteilte Blöcke a 5 MB sein könnten. Dann bekommst Du zwar noch jede Menge 5 MB Blöcke, aber keinen 50 MB-Block mehr, weil nirgendwo 50 MB am Stück frei sind (Speicherfragmentierung). Wie groß ist denn m_iNumQuads im Schnitt?</p>
<p>Ansonsten, mal angenommen m_iNumQuads ist 10.000, und Du machst 17.000 Durchläufe, und nirgends ein delete zwischen den Durchläufen, bist Du auch schon über 900 MB insgesamt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1357888</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1357888</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Mon, 03 Sep 2007 13:04:22 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit regelmäßigem bad_alloc bei new on Mon, 03 Sep 2007 13:06:26 GMT]]></title><description><![CDATA[<p>was steht in m_iNumQuads drin? wie groß (sizeof) ist TVertexIndex? besitzt TVertexIndex einen überladenen operator new[] ? passen alle delete zum new - eckige Klammern irgendwo vergessen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1357894</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1357894</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 03 Sep 2007 13:06:26 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit regelmäßigem bad_alloc bei new on Mon, 03 Sep 2007 21:22:05 GMT]]></title><description><![CDATA[<p>OK, das mit der Speicherfragmentierung verstehe ich. Ich habe auch schon geglaubt, dass das wirklich der Grund des Fehlers ist, zumal <em>leaf-&gt;m_iNumQuads</em> ziemlich große Werte annimmt. Beim Versuch, dies zu optimieren, habe ich einen Fehler gefunden, der diesen Wert unnötig vergrößert. Als ich dann versuchte, diesen zu beheben, bin ich in ein sehr ähnliches Problem geraten, das ich mir mit der Speicherfragmentierung aber nicht erklären kann. Ich versuche, es zu beschreiben:</p>
<p><em>(alle wirklich relevanten Code-Zeilen sind fett hervorgehoben)</em></p>
<p>Erst einmal habe ich die Methode <em>createLeafGeometry()</em>, die rund 17.000 Mal aufgerufen wird:</p>
<pre><code>void createLeafGeometry(TerrainTileQuadTreeData** leaf_) {
	[b]*leaf_ = new CTerrainTileQuadTreeData;[/b]
	TerrainTileQuadTreeData* leaf = *leaf_;

	// ...

	leaf-&gt;m_iNumQuads = countQuads(quadTree);
	leaf-&gt;m_indices = new TVertexIndex[leaf-&gt;m_iNumQuads * 4];

	// ...
}
</code></pre>
<p>Sie behilft sich der Hilfsmethode <em>countQuads()</em>:</p>
<pre><code>int countQuads(CQuadTree* pQuadTree) {
	int iLocalIndices = 0;
	if (pQuadTree-&gt;isLeaf()) {
		iLocalIndices = 1;
	} else {
		for (unsigned int iChild = 0; iChild &lt; 4; iChild++) {
			[b]iLocalIndices += countIndices(pQuadTree-&gt;child(iChild));[/b]
		}
	}
	return iLocalIndices;
}
</code></pre>
<p>Hier habe ich nun den bereits erwähnten Fehler entdeckt: statt rekursiv <em>countQuads()</em> in Zeile 7 aufzurufen, findet sich dort der Aufruf von <em>countIndices</em>, die folgendermaßen definiert ist:</p>
<pre><code>inline int countIndices(CQuadTree* pQuadTree) {
	[b]return countQuads(pQuadTree) * 4;[/b]
}
</code></pre>
<p>Nun habe ich in der Definition von <em>countQuads</em> in Zeile 7 das <em>countIndices</em> durch <em>countQuads</em> ersetzt. Jetzt wird <strong>bereits beim zweiten Aufruf</strong> von createLeafGeometry() in Zeile 2 (bei <em>new</em>) ein bad_alloc geworfen, obwohl der Wert von <em>leaf-&gt;m_indices</em> im vorherigen Aufruf statt bei 35.000 nurnoch bei 49 lag, im vorausgegangenen Schritt also wesentlich weniger Speicher verbraucht wurde. Mit <em>countIndices</em> statt <em>countQuads</em>, was in einem viel zu hohen Wert für <em>leaf-&gt;m_iNumQuads</em> resultiert, wenn also eine Menge Speicher verschwendet wird, hat es ja funktioniert - Deshalb kann ich es mir nicht mit der Speicherfragmentierung erklären.</p>
<p>Kann mir das jemand erklären? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1357967</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1357967</guid><dc:creator><![CDATA[the*V*oid]]></dc:creator><pubDate>Mon, 03 Sep 2007 21:22:05 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit regelmäßigem bad_alloc bei new on Mon, 03 Sep 2007 15:01:22 GMT]]></title><description><![CDATA[<p>Ist das jetzt ein c&amp;p-Fehler oder fehlt in Zeile 6 der Create-Funktion tatsächlich eine Indirektion? Wenn ja, wundert es mich, daß der Code überhaupt compiliert wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1358035</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1358035</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 03 Sep 2007 15:01:22 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit regelmäßigem bad_alloc bei new on Mon, 03 Sep 2007 15:11:36 GMT]]></title><description><![CDATA[<p>the[V]oid schrieb:</p>
<blockquote>
<p>Jetzt wird <strong>bereits beim zweiten Aufruf</strong> von createLeafGeometry() in Zeile 2 (bei <em>new</em>) ein bad_alloc geworfen</p>
</blockquote>
<p>Bist du dir auch sicher, dass der Fehler bei eben genau diesem &quot;new&quot; kommt und nicht evtl aus dem Konstruktor von &quot;CTerrainTileQuadTreeData&quot;, dass da vielleicht zuviel Speicher angefordert wird?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1358049</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1358049</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Mon, 03 Sep 2007 15:11:36 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit regelmäßigem bad_alloc bei new on Mon, 03 Sep 2007 21:28:06 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Ist das jetzt ein c&amp;p-Fehler oder fehlt in Zeile 6 der Create-Funktion tatsächlich eine Indirektion?</p>
</blockquote>
<p>Sorry, war ein C&amp;P Fehler! Ist nun verbessert.</p>
<p>Badestrand schrieb:</p>
<blockquote>
<p>Bist du dir auch sicher, dass der Fehler bei eben genau diesem &quot;new&quot; kommt und nicht evtl aus dem Konstruktor von &quot;CTerrainTileQuadTreeData&quot;, dass da vielleicht zuviel Speicher angefordert wird?</p>
</blockquote>
<p>Ja, da bin ich mir sicher. Der Konstruktor von <em>CTerrainTileQuadTreeData</em> ist übrigens leer:</p>
<pre><code>class CTerrainTileQuadTreeData {
public:
	CTerrainTileQuadTreeData() {}
	// ...
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1358355</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1358355</guid><dc:creator><![CDATA[the*V*oid]]></dc:creator><pubDate>Mon, 03 Sep 2007 21:28:06 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit regelmäßigem bad_alloc bei new on Mon, 03 Sep 2007 21:31:35 GMT]]></title><description><![CDATA[<p>the[V]oid schrieb:</p>
<blockquote>
<p>Der Konstruktor von <em>CTerrainTileQuadTreeData</em> ist übrigens leer:</p>
</blockquote>
<p>Ganz schlecht. Warum macht createLeafGeometry die Arbeit, die der Konstruktor tun sollte? Vielleicht liegts ja schlicht an etwas nicht Initialisiertem.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1358359</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1358359</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 03 Sep 2007 21:31:35 GMT</pubDate></item></channel></rss>