<?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[Beschädigung des Heaps]]></title><description><![CDATA[<p>Ich habe zur Übung eine eigene Vektor-Klasse geschrieben (nach dem Buch TICPP). Jetzt bekomme ich die folgende Fehlermeldung und werde daraus überhaupt nicht schlau.</p>
<blockquote>
<p>HEAP[0112.exe]: Heap block at 003B80E8 modified at 003B842C past requested size of 33c<br />
Windows hat einen Haltepunkt in 0112.exe ausgelöst.</p>
<p>Dies kann auf eine Beschädigung des Heaps zurückzuführen sein und weist auf ein Problem in 0112.exe oder in einer der geladenen DLLs hin.</p>
</blockquote>
<pre><code class="language-cpp">#include &quot;vector.h&quot;
#include &quot;fraction.h&quot;
const int increment = 100;

vector::vector(int sz)
{
	size = sz;
	quantity = 0;
	storage = 0;
	next = 0;
}

void vector::push_back(void* element)
{
	if (next &gt;= quantity)
		inflate(increment);

	int startBytes = next*size;
	// cast element to unsigned char array
	unsigned char* e = (unsigned char*)element;
	for (int i = 0; i &lt; size; i++)
		storage[startBytes+i]=e[i];
	next++;
}

void vector::inflate(int increase)
{
	int newQuantity = quantity + increase;
	int newBytes = newQuantity * size;
	int oldBytes = quantity * size;
	unsigned char* b = new unsigned char[newBytes];

	for (int i = 0; i &lt; oldBytes; i++)
		b[i] = storage[i];

        // HEAP-Error??
	delete []storage;
	storage = b;
	quantity = newQuantity;
}

vector::~vector()
{
	//HEAP error??
	if (storage != 0) delete[] storage;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/168899/beschädigung-des-heaps</link><generator>RSS for Node</generator><lastBuildDate>Sat, 19 Sep 2026 10:14:46 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/168899.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 29 Dec 2006 12:32:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Beschädigung des Heaps on Fri, 29 Dec 2006 12:32:45 GMT]]></title><description><![CDATA[<p>Ich habe zur Übung eine eigene Vektor-Klasse geschrieben (nach dem Buch TICPP). Jetzt bekomme ich die folgende Fehlermeldung und werde daraus überhaupt nicht schlau.</p>
<blockquote>
<p>HEAP[0112.exe]: Heap block at 003B80E8 modified at 003B842C past requested size of 33c<br />
Windows hat einen Haltepunkt in 0112.exe ausgelöst.</p>
<p>Dies kann auf eine Beschädigung des Heaps zurückzuführen sein und weist auf ein Problem in 0112.exe oder in einer der geladenen DLLs hin.</p>
</blockquote>
<pre><code class="language-cpp">#include &quot;vector.h&quot;
#include &quot;fraction.h&quot;
const int increment = 100;

vector::vector(int sz)
{
	size = sz;
	quantity = 0;
	storage = 0;
	next = 0;
}

void vector::push_back(void* element)
{
	if (next &gt;= quantity)
		inflate(increment);

	int startBytes = next*size;
	// cast element to unsigned char array
	unsigned char* e = (unsigned char*)element;
	for (int i = 0; i &lt; size; i++)
		storage[startBytes+i]=e[i];
	next++;
}

void vector::inflate(int increase)
{
	int newQuantity = quantity + increase;
	int newBytes = newQuantity * size;
	int oldBytes = quantity * size;
	unsigned char* b = new unsigned char[newBytes];

	for (int i = 0; i &lt; oldBytes; i++)
		b[i] = storage[i];

        // HEAP-Error??
	delete []storage;
	storage = b;
	quantity = newQuantity;
}

vector::~vector()
{
	//HEAP error??
	if (storage != 0) delete[] storage;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1199402</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1199402</guid><dc:creator><![CDATA[yabba]]></dc:creator><pubDate>Fri, 29 Dec 2006 12:32:45 GMT</pubDate></item><item><title><![CDATA[Reply to Beschädigung des Heaps on Fri, 29 Dec 2006 12:47:30 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>was mir gerade auffaellt, size wird gar nicht neu gesetzt...oder uebersehe<br />
ich da grad was?</p>
<p>gruss<br />
v R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1199404</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1199404</guid><dc:creator><![CDATA[virtuell Realisticer]]></dc:creator><pubDate>Fri, 29 Dec 2006 12:47:30 GMT</pubDate></item><item><title><![CDATA[Reply to Beschädigung des Heaps on Fri, 29 Dec 2006 12:57:24 GMT]]></title><description><![CDATA[<p>Size steht hier für die größe eines Elements und wird daher nur am Anfang initialisiert: vector(sizeof(foo));</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1199410</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1199410</guid><dc:creator><![CDATA[yabba]]></dc:creator><pubDate>Fri, 29 Dec 2006 12:57:24 GMT</pubDate></item><item><title><![CDATA[Reply to Beschädigung des Heaps on Fri, 29 Dec 2006 21:41:04 GMT]]></title><description><![CDATA[<p>Fehler sehe ich erstmal keine. Welche Funktionen gibt es denn sonst noch in der Klasse? Bzw. versuche ein Minimalbeispiel zusammenzustellen, welches den Fehler verursacht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1199694</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1199694</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Fri, 29 Dec 2006 21:41:04 GMT</pubDate></item><item><title><![CDATA[Reply to Beschädigung des Heaps on Tue, 13 Mar 2007 09:27:32 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe gerade das gleiche Problem bekommen. Habe die Klasse vector aber nicht selber geschrieben, sonder verwende std::vector.</p>
<p>Irgendeine Idee?</p>
<p>Danke!<br />
mfg,<br />
shed</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1244540</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1244540</guid><dc:creator><![CDATA[shed]]></dc:creator><pubDate>Tue, 13 Mar 2007 09:27:32 GMT</pubDate></item><item><title><![CDATA[Reply to Beschädigung des Heaps on Tue, 13 Mar 2007 09:31:18 GMT]]></title><description><![CDATA[<p>shed schrieb:</p>
<blockquote>
<p>Irgendeine Idee?</p>
</blockquote>
<p>Bereichsüberschreitungen?</p>
<p>vector::op[] überprüft nicht, ob es einen legalen Index bekommt - wenn du einen negativen Wert oder einen Wert &gt;=size() übergibst, erzeugst du undefiniertes Verhalten. Und das kann im Ernstfall bedeuten, daß du wichtige Daten des Heap-Managers (oder schlimmeres) pulverisierst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1244543</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1244543</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 13 Mar 2007 09:31:18 GMT</pubDate></item><item><title><![CDATA[Reply to Beschädigung des Heaps on Tue, 13 Mar 2007 09:36:31 GMT]]></title><description><![CDATA[<p>ich verwende eigentlich nur vector.push_back(), vector.pop_back() und <a href="http://vector.at" rel="nofollow">vector.at</a>(),<br />
d.h gebe ich ihm ja selbst keinen index mit.</p>
<p>Muss ich da trotzdem aufpassen? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1244545</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1244545</guid><dc:creator><![CDATA[shed]]></dc:creator><pubDate>Tue, 13 Mar 2007 09:36:31 GMT</pubDate></item><item><title><![CDATA[Reply to Beschädigung des Heaps on Tue, 13 Mar 2007 09:50:37 GMT]]></title><description><![CDATA[<p>hab ich bei stacks das gleich problem?<br />
Bzw. gibt es noch andere Möglichkeiten wann der Fehler auftreten kann außer bei verwendung eines vectors?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1244551</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1244551</guid><dc:creator><![CDATA[shed]]></dc:creator><pubDate>Tue, 13 Mar 2007 09:50:37 GMT</pubDate></item><item><title><![CDATA[Reply to Beschädigung des Heaps on Tue, 13 Mar 2007 11:39:54 GMT]]></title><description><![CDATA[<p>Der Fehler kann (naturgemäß) immer dann auftreten, wenn du auf dem Heap hantierst. Btw, es ist noch nicht einmal gesagt, daß der vector/stack den Fehler verursacht - viel wahrscheinlicher ist es, daß du von einem anderen Zeiger aus die Daten des vector's zerstört hast.</p>
<p>(Zeig doch mal etwas Code)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1244591</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1244591</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 13 Mar 2007 11:39:54 GMT</pubDate></item><item><title><![CDATA[Reply to Beschädigung des Heaps on Tue, 13 Mar 2007 13:10:28 GMT]]></title><description><![CDATA[<blockquote>
<p>Und das kann im Ernstfall bedeuten, daß du wichtige Daten des Heap-Managers (oder schlimmeres) pulverisierst.</p>
</blockquote>
<p>Was ist denn ein Heap-Manager ?!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1244665</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1244665</guid><dc:creator><![CDATA[mikey]]></dc:creator><pubDate>Tue, 13 Mar 2007 13:10:28 GMT</pubDate></item><item><title><![CDATA[Reply to Beschädigung des Heaps on Tue, 13 Mar 2007 13:14:33 GMT]]></title><description><![CDATA[<p>Na, was denkst du ;)?</p>
<p>Der Heap-Manager ist derjenige, der sich um die Speicherreservierungen auf dem Heap (new/delete oder malloc/free) kümmert und dafür sorgt, daß jeder soviel Speicher zugewiesen bekommt, wie er benötigt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1244669</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1244669</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 13 Mar 2007 13:14:33 GMT</pubDate></item><item><title><![CDATA[Reply to Beschädigung des Heaps on Tue, 13 Mar 2007 18:28:41 GMT]]></title><description><![CDATA[<p>Das habe ich vermutet, jedoch hat mich die Aussage &quot;Heap Manager zerstören&quot; schon etwas stutzig gemacht ! Wie sollte man den Heap - Manager &quot;zerstören&quot; können ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1244908</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1244908</guid><dc:creator><![CDATA[mikey]]></dc:creator><pubDate>Tue, 13 Mar 2007 18:28:41 GMT</pubDate></item><item><title><![CDATA[Reply to Beschädigung des Heaps on Tue, 13 Mar 2007 19:37:24 GMT]]></title><description><![CDATA[<p>Indem Du einen Teil des Speicherbereichs überschreibst in dem new und delete zur runtime liegen... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>greetz, Swordfish</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1244971</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1244971</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Tue, 13 Mar 2007 19:37:24 GMT</pubDate></item><item><title><![CDATA[Reply to Beschädigung des Heaps on Tue, 13 Mar 2007 22:43:09 GMT]]></title><description><![CDATA[<p>Ich habe hier eine ganz wage vermutung. Setz mal um deine beiden</p>
<pre><code class="language-cpp">delete[] storage;
</code></pre>
<p>eine if-Abfrage, dass das ganze jeweils so aussieht:</p>
<pre><code class="language-cpp">if (storage != 0)
{
delete[] storage;
}
</code></pre>
<p>Ich lese nähmlich aus deiner Zeile hier:</p>
<pre><code class="language-cpp">unsigned char* b = new unsigned char[newBytes];
</code></pre>
<p>Dass deine storage-variable ein Pointer auf unsigned char ist, was ok ist, aber diese Zeile hier im konstruktor:</p>
<pre><code class="language-cpp">storage = 0;
</code></pre>
<p>Setzt eben diesen Pointer auf 0 (oder besser: NULL), wodurch es natürlich zum Fehler kommt, wenn du versuchst auf storage ein delete anzuwenden, so lange noch keine gültige Adresse dahinter liegt.</p>
<p>Ich hoffe, es hilft was.</p>
<p>Grüße<br />
FloFri</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1245071</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1245071</guid><dc:creator><![CDATA[FloFri]]></dc:creator><pubDate>Tue, 13 Mar 2007 22:43:09 GMT</pubDate></item><item><title><![CDATA[Reply to Beschädigung des Heaps on Tue, 13 Mar 2007 22:46:56 GMT]]></title><description><![CDATA[<p><code>delete[]</code> erkennt 0-Pointer selbst. Ein <code>if(x) delete[] x;</code> ist daher nicht nötig.</p>
<p>Wenn du Probleme mit dem Heap hast, solltest du mal Valgrind benutzen oder wo das nicht verfügbar ist <a href="http://duma.sourceforge.net/" rel="nofollow">DUMA</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1245075</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1245075</guid><dc:creator><![CDATA[rüdiger]]></dc:creator><pubDate>Tue, 13 Mar 2007 22:46:56 GMT</pubDate></item><item><title><![CDATA[Reply to Beschädigung des Heaps on Wed, 14 Mar 2007 07:16:14 GMT]]></title><description><![CDATA[<p>mikey schrieb:</p>
<blockquote>
<p>Das habe ich vermutet, jedoch hat mich die Aussage &quot;Heap Manager zerstören&quot; schon etwas stutzig gemacht ! Wie sollte man den Heap - Manager &quot;zerstören&quot; können ?</p>
</blockquote>
<p>Da hast du etwas missverstanden - du zerstörst nicht &quot;den Heap-Manager&quot;, sondern &quot;wichtige Daten des Heap-Managers&quot; (z.B. seine Notizen, wie lang jeder angeforderte Speicherbereich war).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1245135</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1245135</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 14 Mar 2007 07:16:14 GMT</pubDate></item></channel></rss>