<?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[Probleme mit malloc &#x2F; free (DAMAGE: after Normal block (#142) at 0x00B65A20.)]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe mir eine kleine Klasse geschrieben, die einen String splitten kann und ein dynamisch allokiertes Array zurück gibt. Der Aufruf der Methode in der Klasse kann beispielsweise so aussehen:</p>
<pre><code class="language-cpp">char** composite = NULL;
int y = StringTokenizer::split('+', '?', buf, composite);
</code></pre>
<p>In der eigentlichen Methode kommt es nun zu einem Problem, wenn ich den dynamischen Speicher allokiere (malloc -&gt; äußere Felddefinition). Der Debugger meldet mir dann:</p>
<p>`</p>
<p>memory check error at 0x00B65AE4 = 0x00, should be 0xFD.</p>
<p>memory check error at 0x00B65AE5 = 0x00, should be 0xFD.</p>
<p>memory check error at 0x00B65AE6 = 0x00, should be 0xFD.</p>
<p>memory check error at 0x00B65AE7 = 0x00, should be 0xFD.</p>
<p>DAMAGE: after Normal block (#142) at 0x00B65A20.</p>
<p>Normal located at 0x00B65A20 is 196 bytes long.</p>
<p>Detected memory leaks!</p>
<p>`</p>
<p>Die entsprechende Methode sieht wie folgt aus:</p>
<pre><code class="language-cpp">int StringTokenizer::split(char delim, char cast, char* buf, char** &amp;arr) {
  unsigned int i=0, j=0;		// Hauptzähler für den Array-Aufbau
  unsigned int sg=0;		// Segment-Zähler, Anzahl der Elemente im Array
  arr = NULL;

  int tmpFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG );
  tmpFlag |= _CRTDBG_LEAK_CHECK_DF;
  _CrtSetDbgFlag( tmpFlag );

  if (buf == NULL) return sg;

  // Anzahl der Separatoren zählen
  for(i=0; buf[i] != '\0' || i &lt; strlen(buf); i++) {
     if (buf[i] != cast &amp;&amp; buf[i+1] == delim) ++sg;
  }

  // kein Segment gefunden
  if (sg == 0) return sg;

  // Speicher bereit stellen
  if(arr == NULL) {
    arr = (char**)malloc(sg * sizeof(char*));
    if (arr == NULL) {
       printf(&quot;Konnte keinen Speicher reservieren.\n&quot;);
       return sg;
       }
  }
  assert(_CrtCheckMemory());

  // Speicher mit Inhalten füllen	
  for(i=0; i &lt;= sg; i++) {
    arr[i] = NULL;
    if(arr[i] == NULL)
      arr[i] = (char*) malloc(MAX_CHARS * sizeof(char));
  }
  assert(_CrtCheckMemory());

  int sc=0; i=0;

  while (buf[i] != '\0') {
    if(arr[sc] == NULL) {
      printf(&quot;Konnte keinen Speicher reservieren.\n&quot;);
      return sg;
  }

  arr[sc][j++] = buf[i]; 

  if (i &gt; 1 &amp;&amp; buf[i] == delim &amp;&amp; buf[i-1] != cast) {			
    arr[sc][--j] = '\0';	// Durch Eintrag wird das Split-Symbol gelöscht
    arr[sc] = (char*)realloc((char*)arr[sc], (j+1) * sizeof(char));
    assert(_CrtCheckMemory());
    sc++;	// Neues Segment	
    j=0;	// Zähler zurücksetzen						
  }
		             i++;												
  } 

  // Nach dem Sprung aus der Schleife muss das letzte Element auch 
  // noch einmal neu berechnet werden
  arr[sc][j] = '\0';
  arr[sc] = (char*)realloc((char*)arr[sc], (j+1) * sizeof(char));	
  assert(_CrtCheckMemory());

  return sg+1;	
}
</code></pre>
<p>Kann mir jemand sagen, was ich hier falsch mache?</p>
<p>Grüße<br />
Björn</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/247041/probleme-mit-malloc-free-damage-after-normal-block-142-at-0x00b65a20</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 16:55:51 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/247041.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 05 Aug 2009 10:00:08 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Probleme mit malloc &#x2F; free (DAMAGE: after Normal block (#142) at 0x00B65A20.) on Wed, 05 Aug 2009 10:00:08 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe mir eine kleine Klasse geschrieben, die einen String splitten kann und ein dynamisch allokiertes Array zurück gibt. Der Aufruf der Methode in der Klasse kann beispielsweise so aussehen:</p>
<pre><code class="language-cpp">char** composite = NULL;
int y = StringTokenizer::split('+', '?', buf, composite);
</code></pre>
<p>In der eigentlichen Methode kommt es nun zu einem Problem, wenn ich den dynamischen Speicher allokiere (malloc -&gt; äußere Felddefinition). Der Debugger meldet mir dann:</p>
<p>`</p>
<p>memory check error at 0x00B65AE4 = 0x00, should be 0xFD.</p>
<p>memory check error at 0x00B65AE5 = 0x00, should be 0xFD.</p>
<p>memory check error at 0x00B65AE6 = 0x00, should be 0xFD.</p>
<p>memory check error at 0x00B65AE7 = 0x00, should be 0xFD.</p>
<p>DAMAGE: after Normal block (#142) at 0x00B65A20.</p>
<p>Normal located at 0x00B65A20 is 196 bytes long.</p>
<p>Detected memory leaks!</p>
<p>`</p>
<p>Die entsprechende Methode sieht wie folgt aus:</p>
<pre><code class="language-cpp">int StringTokenizer::split(char delim, char cast, char* buf, char** &amp;arr) {
  unsigned int i=0, j=0;		// Hauptzähler für den Array-Aufbau
  unsigned int sg=0;		// Segment-Zähler, Anzahl der Elemente im Array
  arr = NULL;

  int tmpFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG );
  tmpFlag |= _CRTDBG_LEAK_CHECK_DF;
  _CrtSetDbgFlag( tmpFlag );

  if (buf == NULL) return sg;

  // Anzahl der Separatoren zählen
  for(i=0; buf[i] != '\0' || i &lt; strlen(buf); i++) {
     if (buf[i] != cast &amp;&amp; buf[i+1] == delim) ++sg;
  }

  // kein Segment gefunden
  if (sg == 0) return sg;

  // Speicher bereit stellen
  if(arr == NULL) {
    arr = (char**)malloc(sg * sizeof(char*));
    if (arr == NULL) {
       printf(&quot;Konnte keinen Speicher reservieren.\n&quot;);
       return sg;
       }
  }
  assert(_CrtCheckMemory());

  // Speicher mit Inhalten füllen	
  for(i=0; i &lt;= sg; i++) {
    arr[i] = NULL;
    if(arr[i] == NULL)
      arr[i] = (char*) malloc(MAX_CHARS * sizeof(char));
  }
  assert(_CrtCheckMemory());

  int sc=0; i=0;

  while (buf[i] != '\0') {
    if(arr[sc] == NULL) {
      printf(&quot;Konnte keinen Speicher reservieren.\n&quot;);
      return sg;
  }

  arr[sc][j++] = buf[i]; 

  if (i &gt; 1 &amp;&amp; buf[i] == delim &amp;&amp; buf[i-1] != cast) {			
    arr[sc][--j] = '\0';	// Durch Eintrag wird das Split-Symbol gelöscht
    arr[sc] = (char*)realloc((char*)arr[sc], (j+1) * sizeof(char));
    assert(_CrtCheckMemory());
    sc++;	// Neues Segment	
    j=0;	// Zähler zurücksetzen						
  }
		             i++;												
  } 

  // Nach dem Sprung aus der Schleife muss das letzte Element auch 
  // noch einmal neu berechnet werden
  arr[sc][j] = '\0';
  arr[sc] = (char*)realloc((char*)arr[sc], (j+1) * sizeof(char));	
  assert(_CrtCheckMemory());

  return sg+1;	
}
</code></pre>
<p>Kann mir jemand sagen, was ich hier falsch mache?</p>
<p>Grüße<br />
Björn</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755585</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755585</guid><dc:creator><![CDATA[lunatic82]]></dc:creator><pubDate>Wed, 05 Aug 2009 10:00:08 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit malloc &#x2F; free (DAMAGE: after Normal block (#142) at 0x00B65A20.) on Wed, 05 Aug 2009 10:05:10 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>lunatic82 schrieb:</p>
<blockquote>
<p>Kann mir jemand sagen, was ich hier falsch mache?</p>
</blockquote>
<p>Du bist im C++-Forum. Dein Code ist aber C.</p>
<p>Edit: na gut, eher sowas ähnliches wie C.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755593</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755593</guid><dc:creator><![CDATA[Registrierter Troll]]></dc:creator><pubDate>Wed, 05 Aug 2009 10:05:10 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit malloc &#x2F; free (DAMAGE: after Normal block (#142) at 0x00B65A20.) on Wed, 05 Aug 2009 10:07:55 GMT]]></title><description><![CDATA[<p>Da es sich um eine Klasse handelt in der der die Methode implementiert ist, denke ich, dass C+++ das richtige Forum ist.</p>
<p>Zumal das Problem auch mit new und delete auftaucht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755598</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755598</guid><dc:creator><![CDATA[lunatic82]]></dc:creator><pubDate>Wed, 05 Aug 2009 10:07:55 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit malloc &#x2F; free (DAMAGE: after Normal block (#142) at 0x00B65A20.) on Wed, 05 Aug 2009 10:14:07 GMT]]></title><description><![CDATA[<p>lunatic82 schrieb:</p>
<blockquote>
<p>Da es sich um eine Klasse handelt in der der die Methode implementiert ist, denke ich, dass C+++ das richtige Forum ist.</p>
<p>Zumal das Problem auch mit new und delete auftaucht.</p>
</blockquote>
<p>Du darfst <code>new</code> , <code>delete</code> (C++ Funktionen) und <code>malloc</code> , <code>free</code> (C Funktionen) <strong>nicht</strong> mischen!</p>
<p>Schreibe deinen Quellcode um, und beschränke dich auf <code>new</code> und <code>delete</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755606</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755606</guid><dc:creator><![CDATA[BBBB]]></dc:creator><pubDate>Wed, 05 Aug 2009 10:14:07 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit malloc &#x2F; free (DAMAGE: after Normal block (#142) at 0x00B65A20.) on Wed, 05 Aug 2009 10:18:04 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>lunatic82 schrieb:</p>
<blockquote>
<p>Da es sich um eine Klasse handelt in der der die Methode implementiert ist, denke ich, dass C+++ das richtige Forum ist.</p>
</blockquote>
<p>rein formell hast du wohl recht. Dein Code ist allerdings sehr viel näher an C als an C++ (C++ ist nämlich mehr als C mit <code>class</code> -Keyword), und lässt außerdem jedem C++-Programmierer die Haare zu Berge stehen und schreiend davonlaufen. Es wird auch kaum einer Lust haben, deinen tollen Code für dich zu debuggen.</p>
<blockquote>
<p>Zumal das Problem auch mit new und delete auftaucht.</p>
</blockquote>
<p>Du meinst natürlich <code>new[]</code> und <code>delete[]</code> , aber wir wollen ja nicht kleinlich sein. <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>Vielleicht helfen dir diese Links weiter:<br />
<a href="http://www.cplusplus.com/reference/string/" rel="nofollow">http://www.cplusplus.com/reference/string/</a><br />
<a href="http://www.cplusplus.com/reference/iostream/stringstream/" rel="nofollow">http://www.cplusplus.com/reference/iostream/stringstream/</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755609</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755609</guid><dc:creator><![CDATA[Registrierter Troll]]></dc:creator><pubDate>Wed, 05 Aug 2009 10:18:04 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit malloc &#x2F; free (DAMAGE: after Normal block (#142) at 0x00B65A20.) on Wed, 05 Aug 2009 10:18:50 GMT]]></title><description><![CDATA[<p>BBBB schrieb:</p>
<blockquote>
<p>Du darfst <code>new</code> , <code>delete</code> (C++ Funktionen) und <code>malloc</code> , <code>free</code> (C Funktionen) <strong>nicht</strong> mischen!</p>
<p>Schreibe deinen Quellcode um, und beschränke dich auf <code>new</code> und <code>delete</code> .</p>
</blockquote>
<p>Also, ich sehe in der Methode oben kein new und kein delete. Das war nur ein Beispiel, dass es damit ebenso wenig geht wenn man die Befehle entsprechend ersetzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755611</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755611</guid><dc:creator><![CDATA[lunatic82]]></dc:creator><pubDate>Wed, 05 Aug 2009 10:18:50 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit malloc &#x2F; free (DAMAGE: after Normal block (#142) at 0x00B65A20.) on Wed, 05 Aug 2009 10:21:08 GMT]]></title><description><![CDATA[<p>lunatic82 schrieb:</p>
<blockquote>
<p>BBBB schrieb:</p>
<blockquote>
<p>Du darfst <code>new</code> , <code>delete</code> (C++ Funktionen) und <code>malloc</code> , <code>free</code> (C Funktionen) <strong>nicht</strong> mischen!</p>
<p>Schreibe deinen Quellcode um, und beschränke dich auf <code>new</code> und <code>delete</code> .</p>
</blockquote>
<p>Also, ich sehe in der Methode oben kein new und kein delete. Das war nur ein Beispiel, dass es damit ebenso wenig geht wenn man die Befehle entsprechend ersetzt.</p>
</blockquote>
<p>Wie und vorallem wo gibst du den reservierten Speicher wieder frei? Lass mich raten. Du nimmst vermutlich delete?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755613</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755613</guid><dc:creator><![CDATA[BBBB]]></dc:creator><pubDate>Wed, 05 Aug 2009 10:21:08 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit malloc &#x2F; free (DAMAGE: after Normal block (#142) at 0x00B65A20.) on Wed, 05 Aug 2009 10:30:15 GMT]]></title><description><![CDATA[<p>BBBB schrieb:</p>
<blockquote>
<p>Wie und vorallem wo gibst du den reservierten Speicher wieder frei? Lass mich raten. Du nimmst vermutlich delete?</p>
</blockquote>
<p>Nö, sondern hier:</p>
<pre><code class="language-cpp">void StringTokenizer::flush(int count, char** arr) {
  for(int j=0; j &lt; count &amp;&amp; arr[j] != NULL; j++) {
     free(arr[j]);		
     assert(_CrtCheckMemory());
  }

  // Im Debug-Modus kommt die Meldung, dass es sich um eine 
  // invalide Adresse für free handelt.
  if(arr != NULL) {		
    free(arr);		
    assert(_CrtCheckMemory());
  }
}
</code></pre>
<p>Und wie ich schon schrieb, er stirbt beim malloc und nicht beim &quot;befreien&quot; des Speichers. Bis dahin kommt er nämlich nicht einmal.</p>
<p>Im übrigen weiß ich, dass man free / malloc nicht mit delete / new mischen kann, weil es unterschiedliche Speicher im System sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755625</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755625</guid><dc:creator><![CDATA[lunatic82]]></dc:creator><pubDate>Wed, 05 Aug 2009 10:30:15 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit malloc &#x2F; free (DAMAGE: after Normal block (#142) at 0x00B65A20.) on Wed, 05 Aug 2009 10:50:19 GMT]]></title><description><![CDATA[<p>Was soll eigentlich folgendes bewirken?</p>
<pre><code class="language-cpp">while (buf[i] != '\0') {
    if(arr[sc] == NULL) {
      printf(&quot;Konnte keinen Speicher reservieren.\n&quot;);
      return sg;
  }
</code></pre>
<p><code>i</code> wird ja gar nicht verändert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755641</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755641</guid><dc:creator><![CDATA[BBBB]]></dc:creator><pubDate>Wed, 05 Aug 2009 10:50:19 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit malloc &#x2F; free (DAMAGE: after Normal block (#142) at 0x00B65A20.) on Wed, 05 Aug 2009 10:57:56 GMT]]></title><description><![CDATA[<p>Ein Array der Größe <code>N</code> hat einen Index-Range von <code>0..N-1</code> . Guck Dir Deinen Code noch mal genau an.<br />
Btw. gibts für sowas (wenns denn unbedingt C sein soll) <code>strtok</code> aus <code>&lt;cstring&gt;</code></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755651</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755651</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 05 Aug 2009 10:57:56 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit malloc &#x2F; free (DAMAGE: after Normal block (#142) at 0x00B65A20.) on Wed, 05 Aug 2009 11:28:40 GMT]]></title><description><![CDATA[<p>BBBB schrieb:</p>
<blockquote>
<p>Was soll eigentlich folgendes bewirken?</p>
<pre><code class="language-cpp">while (buf[i] != '\0') {
    if(arr[sc] == NULL) {
      printf(&quot;Konnte keinen Speicher reservieren.\n&quot;);
      return sg;
  }
</code></pre>
<p><code>i</code> wird ja gar nicht verändert.</p>
</blockquote>
<p>Doch wird es... Beim kopieren ist die Klammer } verrutscht. Die beendet, wenn man genau hinschaut die if-Bedingung und nicht die while-Schleife.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755672</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755672</guid><dc:creator><![CDATA[lunatic82]]></dc:creator><pubDate>Wed, 05 Aug 2009 11:28:40 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit malloc &#x2F; free (DAMAGE: after Normal block (#142) at 0x00B65A20.) on Wed, 05 Aug 2009 11:32:28 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>Ein Array der Größe <code>N</code> hat einen Index-Range von <code>0..N-1</code> . Guck Dir Deinen Code noch mal genau an.<br />
Btw. gibts für sowas (wenns denn unbedingt C sein soll) <code>strtok</code> aus <code>&lt;cstring&gt;</code></p>
</blockquote>
<p>Worauf bezieht sich dein Kommentar?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755678</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755678</guid><dc:creator><![CDATA[lunatic82]]></dc:creator><pubDate>Wed, 05 Aug 2009 11:32:28 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit malloc &#x2F; free (DAMAGE: after Normal block (#142) at 0x00B65A20.) on Wed, 05 Aug 2009 11:37:32 GMT]]></title><description><![CDATA[<p>lunatic82 schrieb:</p>
<blockquote>
<p>Tachyon schrieb:</p>
<blockquote>
<p>Ein Array der Größe <code>N</code> hat einen Index-Range von <code>0..N-1</code> . Guck Dir Deinen Code noch mal genau an.<br />
Btw. gibts für sowas (wenns denn unbedingt C sein soll) <code>strtok</code> aus <code>&lt;cstring&gt;</code></p>
</blockquote>
<p>Worauf bezieht sich dein Kommentar?</p>
</blockquote>
<p>Guck Dir mal die Abbruchbedingungen Deiner <code>for</code> -Schleifen an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755683</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755683</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 05 Aug 2009 11:37:32 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit malloc &#x2F; free (DAMAGE: after Normal block (#142) at 0x00B65A20.) on Wed, 05 Aug 2009 11:45:16 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>Guck Dir mal die Abbruchbedingungen Deiner <code>for</code> -Schleifen an.</p>
</blockquote>
<pre><code class="language-cpp">for(i=0; i &lt;= sg; i++) {
  *arr[i] = NULL;
  if(*arr[i] == NULL)
     *arr[i] = (char*) malloc(MAX_CHARS * sizeof(char));
}
</code></pre>
<p>Die Schleife ist meines Erachtesn korrekt, denn am Anfang werden die Separatoren gezählt. Ein ensprechender String kann z.B. so aussehen:</p>
<p>UNA+Hallo+Test+möp'</p>
<p>Gezählt werden drei Separatoren, ich benötige in meinem Array aber vier Elemente, um alle Zeichenketten speichern zu können, deswegen i &lt;=sg.</p>
<p>Zum Thema strtok. Strtok funktioniert nicht so ganz einfach für den Anwendungsfall, denn z.B. ist ein ?+ kein Separator.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755688</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755688</guid><dc:creator><![CDATA[lunatic82]]></dc:creator><pubDate>Wed, 05 Aug 2009 11:45:16 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit malloc &#x2F; free (DAMAGE: after Normal block (#142) at 0x00B65A20.) on Wed, 05 Aug 2009 11:48:45 GMT]]></title><description><![CDATA[<p>Dein Array ist aber nicht groß genug für i==sg.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755690</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755690</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 05 Aug 2009 11:48:45 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit malloc &#x2F; free (DAMAGE: after Normal block (#142) at 0x00B65A20.) on Wed, 05 Aug 2009 11:57:27 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>Dein Array ist aber nicht groß genug für i==sg.</p>
</blockquote>
<p>Versteh ich nicht, denn i &lt;= sg, beinhaltet auch den Fall i==sg.</p>
<p>Im übrigen fliegt der Code schon viel eher (schrieb ich auch) und zwar hier:</p>
<pre><code class="language-cpp">// Speicher bereit stellen
if(arr == NULL) {
   arr = (char**)malloc(sg * sizeof(char*));		
   if (arr == NULL) {
      printf(&quot;Konnte keinen Speicher reservieren.\n&quot;);
      return sg;
   }
}
</code></pre>
<p>Und das hat nichts mit einer Schleife zu tun.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755698</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755698</guid><dc:creator><![CDATA[lunatic82]]></dc:creator><pubDate>Wed, 05 Aug 2009 11:57:27 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit malloc &#x2F; free (DAMAGE: after Normal block (#142) at 0x00B65A20.) on Wed, 05 Aug 2009 12:05:50 GMT]]></title><description><![CDATA[<p>lunatic82 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">if(arr == NULL) {
   arr = (char**)malloc(sg * sizeof(char*));		
   if (arr == NULL) {
      printf(&quot;Konnte keinen Speicher reservieren.\n&quot;);
      return sg;
   }
}
</code></pre>
<p>Und das hat nichts mit einer Schleife zu tun.</p>
</blockquote>
<p>Dann machst Du schon verher was kaputt. Das oben stehende sollte gehen.</p>
<p>Nochmal:<br />
Hier...</p>
<pre><code class="language-cpp">arr = (char**)malloc(sg * sizeof(char*));
</code></pre>
<p>...reserviertst Du für <code>sg</code> Elemente Speicher. Der Index geht von <code>0..sg-1</code> .</p>
<p>Hier hingegen...</p>
<pre><code class="language-cpp">for(i=0; i &lt;= sg; i++) { ...
</code></pre>
<p>...greist Du auf <code>0..sg</code> zu. Ein Element mit dem Index <code>sg</code> existiert aber nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755700</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755700</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 05 Aug 2009 12:05:50 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit malloc &#x2F; free (DAMAGE: after Normal block (#142) at 0x00B65A20.) on Wed, 05 Aug 2009 12:33:15 GMT]]></title><description><![CDATA[<p>lunatic82 schrieb:</p>
<blockquote>
<p>Tachyon schrieb:</p>
<blockquote>
<p>Dein Array ist aber nicht groß genug für i==sg.</p>
</blockquote>
<p>Versteh ich nicht, denn i &lt;= sg, beinhaltet auch den Fall i==sg.</p>
</blockquote>
<p>Eben drum. Von 0..sg sinds insgesamt sg+1 Schritte, und du reservierst nur Speicher für sg Pointer. Typischer Zaunlattenfehler <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>
<blockquote>
<p>Im übrigen fliegt der Code schon viel eher (schrieb ich auch) und zwar hier:</p>
<pre><code class="language-cpp">// Speicher bereit stellen
if(arr == NULL) {
   arr = (char**)malloc(sg * sizeof(char*));		
   if (arr == NULL) {
      printf(&quot;Konnte keinen Speicher reservieren.\n&quot;);
      return sg;
   }
}
</code></pre>
<p>Und das hat nichts mit einer Schleife zu tun.</p>
</blockquote>
<p>Da gibts zwei mögliche Gründe warums fliegt:</p>
<ol>
<li>printf() - Unwahrscheinlich, aber ersetz es mal testweise mit cout bzw. cerr, schließlich machst du eh C++ bzw. gibst es mit deiner Klasse zumindest vor.</li>
<li>malloc() - auch unwahrscheinlich. Du könntest es allerdings zum Testen mal nurch ein new char*[sg+1] ersetzen.</li>
</ol>
<p>Bist du tatsächlich mit dem Debugger durchgesteppt und hast rausgefunden dass es dort fliegt? Eventuell geht auch die Funktion die du im assert() aufrufst in die Hose, wäre zumindest ein idealer Kandidat dafür (heißt CheckMemory und du bekommst Memory check error...)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755707</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755707</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 05 Aug 2009 12:33:15 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit malloc &#x2F; free (DAMAGE: after Normal block (#142) at 0x00B65A20.) on Wed, 05 Aug 2009 12:31:37 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/4465">@Tachyon</a>:<br />
Ja stimmt, jetzt wird mir das auch klar. Manchmal ist man echt blind.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9960">@pumuckl</a>:<br />
Aber selbst, wenn ich die Anmerkung von Tachyon berücksichtige, bricht er mir schon beim ersten malloc oder new, wenn ich die assert-Bedingung drin habe. Wenn ich die entferne, dann geht er bis zum zweiten malloc oder new und dann bricht er dort mit einer Exception ab.</p>
<ol>
<li>printf ist es definitiv nicht</li>
<li>assert meldet schon korrekt, dass der Heap beschädigt ist, deswegen funktioniert das zweite malloc nicht. Wenn dort i=i ist, dann fliegt er eben an dieser Stelle.</li>
</ol>
<p>Ich steppe in der Tat mit dem Debugger durch den Quelltext und schaue mir an, was dort passiert. Und es ist mir unerklärlich. split bzw. flush sind auch die einzigen Funktionen, die dynamisch in dem Code Speicher reservieren.</p>
<p>Gibt es noch andere konstruktive Ideen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755725</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755725</guid><dc:creator><![CDATA[lunatic82]]></dc:creator><pubDate>Wed, 05 Aug 2009 12:31:37 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit malloc &#x2F; free (DAMAGE: after Normal block (#142) at 0x00B65A20.) on Wed, 05 Aug 2009 12:35:55 GMT]]></title><description><![CDATA[<p>lunatic82 schrieb:</p>
<blockquote>
<p>Gibt es noch andere konstruktive Ideen?</p>
</blockquote>
<p>Gibt es einen Grund dafür, warum du dich mit diesen altertümlichen und fehleranfälligen C-Konstrukten abquälst, statt die Sache sauber mit C++-Strings zu implementieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755731</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755731</guid><dc:creator><![CDATA[Registrierter Troll]]></dc:creator><pubDate>Wed, 05 Aug 2009 12:35:55 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit malloc &#x2F; free (DAMAGE: after Normal block (#142) at 0x00B65A20.) on Wed, 05 Aug 2009 12:38:47 GMT]]></title><description><![CDATA[<p>Registrierter Troll schrieb:</p>
<blockquote>
<p>Gibt es einen Grund dafür, warum du dich mit diesen altertümlichen und fehleranfälligen C-Konstrukten abquälst, statt die Sache sauber mit C++-Strings zu implementieren?</p>
</blockquote>
<p>Weil ich zum sauberen Verarbeiten der Informationen eh wieder alles in einen char** umwandeln muss und aus Gründen der Portabilität käme eh nur std::string und nicht CString in Frage.</p>
<p>Und std::string isst genau so ein Krampf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755733</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755733</guid><dc:creator><![CDATA[lunatic82]]></dc:creator><pubDate>Wed, 05 Aug 2009 12:38:47 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit malloc &#x2F; free (DAMAGE: after Normal block (#142) at 0x00B65A20.) on Wed, 05 Aug 2009 12:44:41 GMT]]></title><description><![CDATA[<p>lunatic82 schrieb:</p>
<blockquote>
<p>Weil ich zum sauberen Verarbeiten der Informationen eh wieder alles in einen char** umwandeln muss und aus Gründen der Portabilität käme eh nur std::string und nicht CString in Frage.</p>
</blockquote>
<p>Selbst wenn du nachträglich alles in char-Arrays packen müsstest, was ich ehrlich gesagt für unwahrscheinlich halte, wäre die Suche und das letztendliche Zusammenbauen des Strings eine Sache von ein paar wenigen Zeilen - ohne Buffer overflows und sonstigen Newbie-Krebs.</p>
<p>Wer sagte eigentlich irgendwas von CString?</p>
<blockquote>
<p>Und std::string isst genau so ein Krampf.</p>
</blockquote>
<p>Du irrst dich gewaltig. Alle deine Probleme wären wie weggezaubert, weil du dich nicht mehr um die Speicherverwaltung kümmern müsstest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755740</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755740</guid><dc:creator><![CDATA[Registrierter Troll]]></dc:creator><pubDate>Wed, 05 Aug 2009 12:44:41 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit malloc &#x2F; free (DAMAGE: after Normal block (#142) at 0x00B65A20.) on Wed, 05 Aug 2009 12:49:12 GMT]]></title><description><![CDATA[<p>Da _CrtCheckMemory kein Standard-C++ ist kann ich jetzt nur wilde Vermutungen anstellen was es macht und warum es vielleicht Probleme hat:</p>
<p>Nach der Ausgabe sind da 4 Werte im Speicher, die alle direkt hintereinander sitzen und alle den Wert 0 haben, aber 0xFD erwartet wird. Ich hab mal nach CrtCheckMemory gegooglet und dieses Wunderwerk an gebabelfischtem Ex-Englisch gefunden: <a href="http://support.microsoft.com/kb/833608/de" rel="nofollow">http://support.microsoft.com/kb/833608/de</a><br />
Man kann dort mit etwas Mühe herausinterpretieren, dass CrtCheckMemory bei neu allokiertem Memory eine 0xFDFDFDFD-Belegung erwartet, malloc diese aber nur liefert wenn man vorher _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF); aufruft (musst also das alloc_mem_df-Flag mit deinen anderen Flags verodern).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755747</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755747</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 05 Aug 2009 12:49:12 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit malloc &#x2F; free (DAMAGE: after Normal block (#142) at 0x00B65A20.) on Thu, 06 Aug 2009 11:09:33 GMT]]></title><description><![CDATA[<p>Ich habe es dann doch mit malloc und free aufgegeben, weil der VC6.0-Compiler grundsätzlich ein Problem damit hat.</p>
<p>Ich bin dann doch auf die Variante mit Strings und Vektoren umgestiegen - auch wenn das bedeutet, dass etwas Speicher verschwendet wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1756225</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1756225</guid><dc:creator><![CDATA[lunatic82]]></dc:creator><pubDate>Thu, 06 Aug 2009 11:09:33 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit malloc &#x2F; free (DAMAGE: after Normal block (#142) at 0x00B65A20.) on Thu, 06 Aug 2009 11:23:48 GMT]]></title><description><![CDATA[<p>lunatic82 schrieb:</p>
<blockquote>
<p>VC6.0-Compiler</p>
</blockquote>
<p>Uh. Hättest du das Ding schon früher erwähnt dann wär der Thread nicht so lang geworden. Der VC6 hat mit vielen Dingen ein Problem und ist ein ziemlicher Krampf. Wenn wir das gewusst hätten dann hättest du 5 Posts á la &quot;besorg dir einen aktuellen, ordentlichen Compiler&quot; bekommen und keine Hilfsversuche - die sind bei VC6 nämlich häufig allzu fruchtlos.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1756233</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1756233</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 06 Aug 2009 11:23:48 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit malloc &#x2F; free (DAMAGE: after Normal block (#142) at 0x00B65A20.) on Thu, 06 Aug 2009 11:35:26 GMT]]></title><description><![CDATA[<p>Im Unternehmen verwenden wir den leider und deswegen bin ich darauf angewiesen <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>
<p>Privat würde ich den nie benutzen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1756247</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1756247</guid><dc:creator><![CDATA[lunatic82]]></dc:creator><pubDate>Thu, 06 Aug 2009 11:35:26 GMT</pubDate></item></channel></rss>