<?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[Heap Block bei delete[]]]></title><description><![CDATA[<p>Hallo,<br />
Ich habe ein kleines Problem beim wieder Freisetzen von dynamisch angelegtem Speicher.</p>
<p>Ich schreibe ein kleines Programm, welches mir ermöglicht, Dateien zu verschlüsseln und vor anderen zu sichern, doch irgendwie will es mir den belegten Speicher nicht wieder freigeben.<br />
Hab schon sämtliche mir einfallende Suchmaschinen bemüht, doch leider habe ich nichts aussagekräftiges gefunden...</p>
<p>Beim Aufruf des delete[] Operators kommt beim Debuggen nur die Meldung:</p>
<pre><code>HEAP[Merge.exe]: Heap block at 00B40FE0 modified at 00B5C601 past requested size of 1b619
</code></pre>
<p>Hier ein kleiner Ausschnitt meines Codes:</p>
<pre><code class="language-cpp">void CMergeDlg::WriteResource(std::vector&lt;RESOURCE&gt; &amp; vec, const char *szRoot, char cData, int nHead, int nBody, int nCount)
{
        // einige initialisierungen...

	char *pHead = new char[sizeof(BYTE)+sizeof(bool)+sizeof(int)];
	char *pHeader = new char[nHead];
	char *pBody = new char[nBody];
	ZeroMemory(pBody,nBody);
	ZeroMemory(pHeader,nHead);

        // füllen des char arrays mit Daten

	CFile fOut;
	fOut.Open(dir,CFile::modeCreate | CFile::modeWrite);
	Log(&quot;Writing file...&quot;);
	fOut.Write(pHead,sizeof(BYTE)+sizeof(bool)+sizeof(int));
	fOut.Write(pHeader,nHead);
	fOut.Write(pBody,nBody);
	fOut.Flush();
	fOut.Close();

	delete[] pHeader; // hier kommt die Meldung
	delete[] pHead;
	delete[] pBody;

	Log(&quot;Done...&quot;);
}
</code></pre>
<p>Bin für jede Hilfe 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>
<p>Mfg.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/301604/heap-block-bei-delete</link><generator>RSS for Node</generator><lastBuildDate>Tue, 11 Aug 2026 21:43:15 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/301604.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 30 Mar 2012 18:49:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Heap Block bei delete[] on Fri, 30 Mar 2012 18:49:14 GMT]]></title><description><![CDATA[<p>Hallo,<br />
Ich habe ein kleines Problem beim wieder Freisetzen von dynamisch angelegtem Speicher.</p>
<p>Ich schreibe ein kleines Programm, welches mir ermöglicht, Dateien zu verschlüsseln und vor anderen zu sichern, doch irgendwie will es mir den belegten Speicher nicht wieder freigeben.<br />
Hab schon sämtliche mir einfallende Suchmaschinen bemüht, doch leider habe ich nichts aussagekräftiges gefunden...</p>
<p>Beim Aufruf des delete[] Operators kommt beim Debuggen nur die Meldung:</p>
<pre><code>HEAP[Merge.exe]: Heap block at 00B40FE0 modified at 00B5C601 past requested size of 1b619
</code></pre>
<p>Hier ein kleiner Ausschnitt meines Codes:</p>
<pre><code class="language-cpp">void CMergeDlg::WriteResource(std::vector&lt;RESOURCE&gt; &amp; vec, const char *szRoot, char cData, int nHead, int nBody, int nCount)
{
        // einige initialisierungen...

	char *pHead = new char[sizeof(BYTE)+sizeof(bool)+sizeof(int)];
	char *pHeader = new char[nHead];
	char *pBody = new char[nBody];
	ZeroMemory(pBody,nBody);
	ZeroMemory(pHeader,nHead);

        // füllen des char arrays mit Daten

	CFile fOut;
	fOut.Open(dir,CFile::modeCreate | CFile::modeWrite);
	Log(&quot;Writing file...&quot;);
	fOut.Write(pHead,sizeof(BYTE)+sizeof(bool)+sizeof(int));
	fOut.Write(pHeader,nHead);
	fOut.Write(pBody,nBody);
	fOut.Flush();
	fOut.Close();

	delete[] pHeader; // hier kommt die Meldung
	delete[] pHead;
	delete[] pBody;

	Log(&quot;Done...&quot;);
}
</code></pre>
<p>Bin für jede Hilfe 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>
<p>Mfg.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2197108</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197108</guid><dc:creator><![CDATA[Gast351353546346346]]></dc:creator><pubDate>Fri, 30 Mar 2012 18:49:14 GMT</pubDate></item><item><title><![CDATA[Reply to Heap Block bei delete[] on Fri, 30 Mar 2012 18:57:57 GMT]]></title><description><![CDATA[<p>ich kann gerade nichts falsches sehen an deinem codeauschnitt, aber wieso nimmst du nicht für alles einen vector? dann hättest du das problem nicht. und was ist CFile?? nimm doch std::ofstream</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2197111</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197111</guid><dc:creator><![CDATA[vario-500]]></dc:creator><pubDate>Fri, 30 Mar 2012 18:57:57 GMT</pubDate></item><item><title><![CDATA[Reply to Heap Block bei delete[] on Fri, 30 Mar 2012 19:05:30 GMT]]></title><description><![CDATA[<p>vario-500 schrieb:</p>
<blockquote>
<p>ich kann gerade nichts falsches sehen an deinem codeauschnitt, aber wieso nimmst du nicht für alles einen vector? dann hättest du das problem nicht. und was ist CFile?? nimm doch std::ofstream</p>
</blockquote>
<p>Ich benutze CFile, da ich damit keinen formatierten Text schreibe und ich eh eine MFC Anwendung schreibe, wo CFile implementiert ist.</p>
<p>Du meinst einen char vector wo ich jedes Byte reinschreibe und dann beim schreiben durchiteriere und jedes Byte einzeln schreibe?</p>
<p>Ich glaub, dass das ziemlich an der Performance des Programms zerrt, das werde ich wohl als Endlösung nehmen, weil es ziemlich doof ist, dem Arbeitsspeicher beim überlaufen zuzugucken <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/2197116</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197116</guid><dc:creator><![CDATA[Gast351353546346346]]></dc:creator><pubDate>Fri, 30 Mar 2012 19:05:30 GMT</pubDate></item><item><title><![CDATA[Reply to Heap Block bei delete[] on Fri, 30 Mar 2012 19:06:28 GMT]]></title><description><![CDATA[<p>Der Fehler wird wohl da im ausgelassenen Code sein:</p>
<pre><code class="language-cpp">// füllen des char arrays mit Daten
</code></pre>
<p>Du weißt, dass bei Arrays von 0 bis Länge-1 gezählt wird?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2197117</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197117</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Fri, 30 Mar 2012 19:06:28 GMT</pubDate></item><item><title><![CDATA[Reply to Heap Block bei delete[] on Fri, 30 Mar 2012 19:09:40 GMT]]></title><description><![CDATA[<p>manni66 schrieb:</p>
<blockquote>
<p>Der Fehler wird wohl da im ausgelassenen Code sein:</p>
<pre><code class="language-cpp">// füllen des char arrays mit Daten
</code></pre>
<p>Du weißt, dass bei Arrays von 0 bis Länge-1 gezählt wird?</p>
</blockquote>
<p>Jap, die Länge des Arrays müsste richtig sein, die Dateien werden ja richtig verschlüsselt.<br />
Hier mal der Teil dazwischen, falls euch das irgendwie weiterhilft.<br />
Bin hier echt am verzweifeln..</p>
<pre><code class="language-cpp">int nCurPos = 0;
	int nBodyPos = 0;
	bool bEncryption = true;
	memcpy(&amp;pHead[nCurPos],&amp;byEnc,sizeof(BYTE));nCurPos+=sizeof(BYTE);
	memcpy(&amp;pHead[nCurPos],&amp;bEncryption,sizeof(bool));nCurPos+=sizeof(bool);
	memcpy(&amp;pHead[nCurPos],&amp;nHead,sizeof(int));
	nCurPos = 0;
	memcpy(&amp;pHeader[nCurPos],szVersion,7); nCurPos += 7;
	memcpy(&amp;pHeader[nCurPos],&amp;nCount,sizeof(short)); nCurPos += sizeof(short);
	memcpy(&amp;pHeader[nCurPos],&amp;nDir,sizeof(int));nCurPos+=sizeof(int);
	memcpy(&amp;pHeader[nCurPos],szRoot,nDir);nCurPos+=nDir;

	int nPos = nHead+sizeof(BYTE)+sizeof(bool)+sizeof(int);
	Log(&quot;Merging files&quot;);
	m_pProgress.SetRange(0,vec.size());
	m_pProgress.SetPos(0);
	for(int i = 0; i &lt; vec.size(); ++i)
	{
		RESOURCE *pRes = &amp;vec.at(i);
		char *szPath = new char[_MAX_PATH];
		strcpy(szPath,szRoot);
		strcat(szPath,pRes-&gt;szFileName);

		if(!fIn.Open(szPath,CFile::modeRead))
			continue;
		char *szContent = new char[fIn.GetLength()];
		ZeroMemory(szContent,fIn.GetLength());
		fIn.Read(szContent,fIn.GetLength());

		memcpy(&amp;pHeader[nCurPos],&amp;pRes-&gt;nFileName,sizeof(short));nCurPos += sizeof(short);
		memcpy(&amp;pHeader[nCurPos],pRes-&gt;szFileName,pRes-&gt;nFileName);nCurPos+=pRes-&gt;nFileName;
		memcpy(&amp;pHeader[nCurPos],&amp;pRes-&gt;nFileLength,sizeof(int));nCurPos+=sizeof(int);
		memcpy(&amp;pHeader[nCurPos],&amp;pRes-&gt;nFileTime,sizeof(int));nCurPos+=sizeof(int);
		memcpy(&amp;pHeader[nCurPos],&amp;nPos,sizeof(int));nCurPos+=sizeof(int);
		nPos += pRes-&gt;nFileLength;
		memcpy(&amp;pBody[nBodyPos],szContent,pRes-&gt;nFileLength);nBodyPos+=pRes-&gt;nFileLength;
		m_pProgress.SetPos(i+1);

		delete[] szContent;
	}
	Log(&quot;Done...&quot;);
	pHeader[nHead] = 0;
	pBody[nBody] = 0;

	Log(&quot;Crypting files&quot;);
	for(int i = 0; i &lt; nHead; ++i)
		pHeader[i] = Encryption(pHeader[i],byEnc);
	for(int i = 0; i &lt; nBody; ++i)
		pBody[i] = Encryption(pBody[i],byEnc);
	Log(&quot;Done...&quot;);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2197119</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197119</guid><dc:creator><![CDATA[Gast351353546346346]]></dc:creator><pubDate>Fri, 30 Mar 2012 19:09:40 GMT</pubDate></item><item><title><![CDATA[Reply to Heap Block bei delete[] on Fri, 30 Mar 2012 19:13:12 GMT]]></title><description><![CDATA[<p>Gast351353546346346 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">pHeader[nHead] = 0;
	pBody[nBody] = 0;
</code></pre>
</blockquote>
<p>Fehler grad selber gefunden, echt doofe Sache. Das weg und schon gibt er den Speicher ordnungsgemäß frei...</p>
<p>Vielen Dank für eure Hilfe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2197121</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197121</guid><dc:creator><![CDATA[Gast351353546346346]]></dc:creator><pubDate>Fri, 30 Mar 2012 19:13:12 GMT</pubDate></item><item><title><![CDATA[Reply to Heap Block bei delete[] on Fri, 30 Mar 2012 19:17:29 GMT]]></title><description><![CDATA[<p>also ich weiß nicht genau was du da rum frickelst, aber das sieht echt grausig aus. probier es mal mit nem vector&lt;char&gt; und ich wette mit dir, dass du keine (großen) performance verlusste hast <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="😃"
    /></p>
<p>Edit: seit wann kann man std::ofstream nur formatierten text schreiben??? ich würde versuchen, immer so standardkonform wie möglich zu bleiben. vielleicht soll dein programm auch mal auf nem anderen betriebssystem laufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2197122</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197122</guid><dc:creator><![CDATA[vario-500]]></dc:creator><pubDate>Fri, 30 Mar 2012 19:17:29 GMT</pubDate></item><item><title><![CDATA[Reply to Heap Block bei delete[] on Fri, 30 Mar 2012 19:15:30 GMT]]></title><description><![CDATA[<p>Vielleicht ist ja noch nicht Hopfen und Malz verloren: Versuche doch std::vector oder std::string zu benutzen und vermeide memcpy oder strcat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2197123</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197123</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Fri, 30 Mar 2012 19:15:30 GMT</pubDate></item><item><title><![CDATA[Reply to Heap Block bei delete[] on Fri, 30 Mar 2012 19:21:13 GMT]]></title><description><![CDATA[<p>vario-500 schrieb:</p>
<blockquote>
<p>Edit: seit wann kann man std::ofstream nur formatierten text schreiben??? ich würde versuchen, immer so standardkonform wie möglich zu bleiben. vielleicht soll dein programm auch mal auf nem anderen betriebssystem laufen.</p>
</blockquote>
<p>Ich habe mich da strikt an msdn gehalten, da sollte ja was richtiges stehen o.O<br />
<a href="http://msdn.microsoft.com/de-de/library/60fh2b6f(v=vs.80).aspx" rel="nofollow">http://msdn.microsoft.com/de-de/library/60fh2b6f(v=vs.80).aspx</a></p>
<p>knivil schrieb:</p>
<blockquote>
<p>Vielleicht ist ja noch nicht Hopfen und Malz verloren: Versuche doch std::vector oder std::string zu benutzen und vermeide memcpy oder strcat.</p>
</blockquote>
<p>Was ist denn so falsch daran? :o</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2197127</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197127</guid><dc:creator><![CDATA[Gast351353546346346]]></dc:creator><pubDate>Fri, 30 Mar 2012 19:21:13 GMT</pubDate></item><item><title><![CDATA[Reply to Heap Block bei delete[] on Fri, 30 Mar 2012 19:22:19 GMT]]></title><description><![CDATA[<p>Gast351353546346346 schrieb:</p>
<blockquote>
<p>Was ist denn so falsch daran? :o</p>
</blockquote>
<p>Möglicherweise (Ich hab mir den Code nicht so genau angesehen) ist dein Code zwar korrekt, aber stilistisch ist er leider schrecklich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2197128</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197128</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Fri, 30 Mar 2012 19:22:19 GMT</pubDate></item><item><title><![CDATA[Reply to Heap Block bei delete[] on Fri, 30 Mar 2012 19:27:52 GMT]]></title><description><![CDATA[<p>Beispiel: Du kopierst deinen Header in einen Speicherbereich. Diesen Speicherbereich schreibst du in die Datei. Warum schreibst du denn nicht gleich in die Datei?</p>
<blockquote>
<p>Was ist denn so falsch daran?</p>
</blockquote>
<p>Ein Hort fuer viele Fehlermoeglichkeiten. Auch ist es am besten, schlechte Angewohnheiten gleich im Keim zu ersticken.</p>
<p>Gast351353546346346 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">pHeader[nHead] = 0;
	pBody[nBody] = 0;
</code></pre>
</blockquote>
<p>Hier zum Beispiel: std::vector hat eine Methode at. Genauso wie [], prueft aber ob die Arraygrenzen ueberschritten wurden und wirft notfalls eine Exception. Vielleicht hat VS ja das auch fuer den []-Operator.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2197129</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197129</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Fri, 30 Mar 2012 19:27:52 GMT</pubDate></item><item><title><![CDATA[Reply to Heap Block bei delete[] on Fri, 30 Mar 2012 19:36:37 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<p>Beispiel: Du kopierst deinen Header in einen Speicherbereich. Diesen Speicherbereich schreibst du in die Datei. Warum schreibst du denn nicht gleich in die Datei?</p>
<blockquote>
<p>Was ist denn so falsch daran?</p>
</blockquote>
<p>Ein Hort fuer viele Fehlermoeglichkeiten. Auch ist es am besten, schlechte Angewohnheiten gleich im Keim zu ersticken.</p>
<p>Gast351353546346346 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">pHeader[nHead] = 0;
	pBody[nBody] = 0;
</code></pre>
</blockquote>
<p>Hier zum Beispiel: std::vector hat eine Methode at. Genauso wie [], prueft aber ob die Arraygrenzen ueberschritten wurden und wirft notfalls eine Exception. Vielleicht hat VS ja das auch fuer den []-Operator.</p>
</blockquote>
<p>Jo das hört sich echt böse an...<br />
Aber wie crypte ich denn direkt nen int Wert?<br />
Die Funktion gibt ja nen unsigned char zurück und nimmt ebenfalls nen unsigned char.<br />
Aber ansich ist die Idee super, das direkt zu schreiben anstatt zwischenzuspeichern</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2197132</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197132</guid><dc:creator><![CDATA[Gast351353546346346]]></dc:creator><pubDate>Fri, 30 Mar 2012 19:36:37 GMT</pubDate></item><item><title><![CDATA[Reply to Heap Block bei delete[] on Fri, 30 Mar 2012 20:04:22 GMT]]></title><description><![CDATA[<p>Auf dem ersten Blick hast Du noch ein Problem mit der Zeile 20:</p>
<pre><code class="language-cpp">char *szPath = new char[_MAX_PATH];
</code></pre>
<p>Dieser Block lebt wohl ewig? Und was passiert im Fall von continue? Fragen über Fragen <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="😉"
    /> <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="🙂"
    /><br />
Weiterhin checke ich die Zeilen 4-6 nicht bzw. ihren Sinn. Du kopierst da was rein um direkt!! zu überschreiben?!<br />
Weiterhin in Zeilen 35-36 setzt du einfach die Zeiger weiter in Abhängigkeit von der Dateilänge. Nur warum bist Du Dir sicher, dass es passen wird?<br />
Weiterhin Du öffnest ständig die Dateien ohne sie zu schließen. Mein Wissensstand ist, das nur der Destruktor die Ressourcen von fstream freigibt. Die Open()-Methode tut es nicht.</p>
<p>Aber so richtig lesbar ist dein Code nicht. Sorry <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="😞"
    /> <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/2197135</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197135</guid><dc:creator><![CDATA[Travor]]></dc:creator><pubDate>Fri, 30 Mar 2012 20:04:22 GMT</pubDate></item><item><title><![CDATA[Reply to Heap Block bei delete[] on Fri, 30 Mar 2012 19:54:12 GMT]]></title><description><![CDATA[<p>Gast351353546346346 schrieb:</p>
<blockquote>
<p>Aber wie crypte ich denn direkt nen int Wert?</p>
</blockquote>
<p>da gibt es viele möglichkeiten. hier <a href="http://www.online-tutorials.net/xor/xor-verschlsseln-und-die-keylnge-bestimmen-kryptanalse-teil-1/tutorials-t-114-277.html" rel="nofollow">http://www.online-tutorials.net/xor/xor-verschlsseln-und-die-keylnge-bestimmen-kryptanalse-teil-1/tutorials-t-114-277.html</a> zum beispiel machen sie es mit ner xor-verknüpfung, aber es gibt auch noch tausend andere möglichkeiten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2197138</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197138</guid><dc:creator><![CDATA[vario-500]]></dc:creator><pubDate>Fri, 30 Mar 2012 19:54:12 GMT</pubDate></item></channel></rss>