<?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[AnsiString verursacht Speicherlecks]]></title><description><![CDATA[<p>Hallo an alle,</p>
<p>ich habe vor längerer Zeit etwas sehr merkwürdiges festgestellt. Ich habe mir mal eine Funktion geschrieben, die mir aus einen char-String einen Teilstring als AnsiString zurückliefert:</p>
<pre><code class="language-cpp">AnsiString __fastcall CStr(char *s, int len) 
{ 
    return len ? AnsiString(s).SubString(1,len) : AnsiString(s);
}
</code></pre>
<p>Diese Funktion läßt sich ohne Fehler und Warnungen übersetzen. Die Funktionalität ist auch in Ordnung, aber bei jedem Aufruf wird ein Speicherleck hinterlassen. Wers nicht glaubt, sollte das einfach mal ausprobieren, der Fehler tritt unter CB5 und CB6 auf.</p>
<p>Natürlich läßt sich das auch so lösen:</p>
<pre><code class="language-cpp">String str = String(s,len);
</code></pre>
<p>aber ich wußte das damals noch nicht, und bei Testläufen bin ich dann auf dieses Phänomen gestoßen.<br />
Vielleicht weiß ja jemand Rat, woher der Fehler stammen könnte. Und gleichzeitg soll das auch eine Information sein, was man beim CB unbedingt vermeiden sollte.</p>
<p>Gruß Burkhard</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/60530/ansistring-verursacht-speicherlecks</link><generator>RSS for Node</generator><lastBuildDate>Wed, 05 Aug 2026 06:14:15 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/60530.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 06 Jan 2004 14:49:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to AnsiString verursacht Speicherlecks on Tue, 06 Jan 2004 14:49:18 GMT]]></title><description><![CDATA[<p>Hallo an alle,</p>
<p>ich habe vor längerer Zeit etwas sehr merkwürdiges festgestellt. Ich habe mir mal eine Funktion geschrieben, die mir aus einen char-String einen Teilstring als AnsiString zurückliefert:</p>
<pre><code class="language-cpp">AnsiString __fastcall CStr(char *s, int len) 
{ 
    return len ? AnsiString(s).SubString(1,len) : AnsiString(s);
}
</code></pre>
<p>Diese Funktion läßt sich ohne Fehler und Warnungen übersetzen. Die Funktionalität ist auch in Ordnung, aber bei jedem Aufruf wird ein Speicherleck hinterlassen. Wers nicht glaubt, sollte das einfach mal ausprobieren, der Fehler tritt unter CB5 und CB6 auf.</p>
<p>Natürlich läßt sich das auch so lösen:</p>
<pre><code class="language-cpp">String str = String(s,len);
</code></pre>
<p>aber ich wußte das damals noch nicht, und bei Testläufen bin ich dann auf dieses Phänomen gestoßen.<br />
Vielleicht weiß ja jemand Rat, woher der Fehler stammen könnte. Und gleichzeitg soll das auch eine Information sein, was man beim CB unbedingt vermeiden sollte.</p>
<p>Gruß Burkhard</p>
]]></description><link>https://www.c-plusplus.net/forum/post/429957</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/429957</guid><dc:creator><![CDATA[Burkhi]]></dc:creator><pubDate>Tue, 06 Jan 2004 14:49:18 GMT</pubDate></item><item><title><![CDATA[Reply to AnsiString verursacht Speicherlecks on Tue, 06 Jan 2004 23:18:04 GMT]]></title><description><![CDATA[<p>Burkhi,<br />
also ehrlich gesagt, habe ich da Zweifel:</p>
<ol>
<li>Woher weißt Du, daß memory leaks entstehen?</li>
<li>Was übergibst Du denn an die Funktion? Ein kurzes aber komplettes Beispiel, welches das Problem reproduziert, bringt vielleicht etwas Licht ins Dunkel ...</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/430420</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/430420</guid><dc:creator><![CDATA[dschensky]]></dc:creator><pubDate>Tue, 06 Jan 2004 23:18:04 GMT</pubDate></item><item><title><![CDATA[Reply to AnsiString verursacht Speicherlecks on Wed, 07 Jan 2004 13:49:15 GMT]]></title><description><![CDATA[<p>dschensky schrieb:</p>
<blockquote>
<p>&lt;Fullquote gelöscht&gt;</p>
</blockquote>
<p>Hallo,<br />
na sicher gebe ich dir mal ein Bsp:<br />
- Erzeuge eine neue Anwendung, die einen timer benutzt (mehr brauchst du nicht).<br />
- Setze das Timerinterval auf 10.<br />
- Gib den Code unten ein:</p>
<pre><code class="language-cpp">AnsiString __fastcall CStr(char *s, int len)  
{  
    return len ? AnsiString(s).SubString(1,len) : AnsiString(s); 
}

void __fastcall TForm1::´Timer1Timer(TObject *Sender)
{
    static char *test = &quot;Speicherfresser&quot;;

    Caption = CStr(test,8);

}
</code></pre>
<p>Mach doch dann bitte folgendes:<br />
- Starte das programm<br />
- Schau im Taskmanager unter Prozesse nach und such nach Projekt1.exe (oder wie du das profekt genannt hast), und du wirst sehen, wie schön gemächlich die Speichernutzung zunimmt.<br />
Das läßt sich jederzeit reproduzieren, bei mir nimmt die Speichernutzung ca. alle 2 sek um 4KB zu.</p>
<p>Gruß Burkhard</p>
<p><strong>Edit:</strong><br />
Zitate bitte auf das Notwendigste beschränken. Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/430776</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/430776</guid><dc:creator><![CDATA[Burkhi]]></dc:creator><pubDate>Wed, 07 Jan 2004 13:49:15 GMT</pubDate></item><item><title><![CDATA[Reply to AnsiString verursacht Speicherlecks on Wed, 07 Jan 2004 14:19:57 GMT]]></title><description><![CDATA[<p>Burkhi,</p>
<p>Burkhi schrieb:</p>
<blockquote>
<p>Das läßt sich jederzeit reproduzieren, bei mir nimmt die Speichernutzung ca. alle 2 sek um 4KB zu.</p>
</blockquote>
<p>also bei mir (Win2000, BCB4) bewegt sich da gar nichts. Memproof hat auch nichts auszusetzen.<br />
Bei den Seitenfehlern zappelt es ab und zu. Aber das hat ja nichts mit Speicher-Leaks zu tun.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/430845</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/430845</guid><dc:creator><![CDATA[dschensky]]></dc:creator><pubDate>Wed, 07 Jan 2004 14:19:57 GMT</pubDate></item><item><title><![CDATA[Reply to AnsiString verursacht Speicherlecks on Wed, 07 Jan 2004 20:45:52 GMT]]></title><description><![CDATA[<p>Hallo dschensky ,</p>
<p>na dann hab ich ja die Gewissheit, das ab dem CB5 da wohl etwas fehlerhaft ist, vermutlich ist es die AnsiString-Klasse.<br />
Wie ich ganz oben schon geschrieben hatte, tritt das unter CB5 und CB6 auf. Mit dem CB4 hatte ich das nicht getestet.</p>
<p>Gruß Burkhard</p>
]]></description><link>https://www.c-plusplus.net/forum/post/431183</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/431183</guid><dc:creator><![CDATA[Burkhi]]></dc:creator><pubDate>Wed, 07 Jan 2004 20:45:52 GMT</pubDate></item><item><title><![CDATA[Reply to AnsiString verursacht Speicherlecks on Wed, 07 Jan 2004 22:53:20 GMT]]></title><description><![CDATA[<p>Burkhi,</p>
<p>Burkhi schrieb:</p>
<blockquote>
<p>na dann hab ich ja die Gewissheit, das ab dem CB5 da wohl etwas fehlerhaft ist, vermutlich ist es die AnsiString-Klasse.</p>
</blockquote>
<p>ich habe es im CB6 auch reproduziert - hätte ich nicht gedacht. Ich habe es nochmal etwas reduziert:</p>
<pre><code class="language-cpp">for (int i = 1; i &lt;= 1000; i++)
{
    i ? String(&quot;1&quot;).SubString(1,0) : String(&quot;&quot;);
}
</code></pre>
<p>Nimmt man den SubString-Aufruf heraus, tritt der Effekt nicht mehr auf. Es muß aber auch irgendwie mit dem ?:-Operator zusammenhängen. Der im Grunde äquivalente code</p>
<pre><code class="language-cpp">for (int i = 1; i &lt;= 1000; i++)
{
    if (i)
    {
        String(&quot;1&quot;).SubString(1,0);
    }
    else
    {
        String(&quot;&quot;);
    }
}
</code></pre>
<p>bringt den Effekt nicht hervor.<br />
Poste doch mal ein Beispiel in eine passende Borland Newsgroup.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/431249</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/431249</guid><dc:creator><![CDATA[dschensky]]></dc:creator><pubDate>Wed, 07 Jan 2004 22:53:20 GMT</pubDate></item><item><title><![CDATA[Reply to AnsiString verursacht Speicherlecks on Thu, 08 Jan 2004 07:15:36 GMT]]></title><description><![CDATA[<p>Hallo dschensky</p>
<p>ich habe das schon vor geraumer Zeit Borland mitgeteilt, bis heute 0 Antwort. Und das war zu CB5 Zeiten, aber da der CB6 ja den gleichen Effekt zeigt, hat sich seitens Borlands da wohl nix getan.</p>
<p>Gruß Burkhard</p>
]]></description><link>https://www.c-plusplus.net/forum/post/431298</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/431298</guid><dc:creator><![CDATA[Burkhi]]></dc:creator><pubDate>Thu, 08 Jan 2004 07:15:36 GMT</pubDate></item><item><title><![CDATA[Reply to AnsiString verursacht Speicherlecks on Thu, 08 Jan 2004 08:01:12 GMT]]></title><description><![CDATA[<p>Es muss wirklich irgendein Zusammenhang zwischen SubString und dem operator ?:.<br />
denn, wenn ich</p>
<pre><code class="language-cpp">for (int i = 1; i &lt;= 1000000; i++)
  {
      s = (i==0) ? String(&quot;11&quot;).SubString(1,1) : String(&quot;&quot;); // &lt;= OK
      s = (i==0) ? String(&quot;11&quot;, 1) : String(&quot;&quot;);  // &lt;= OK
  }
</code></pre>
<p>mache, ist alles ok.<br />
bei</p>
<pre><code class="language-cpp">for (int i = 1; i &lt;= 1000000; i++)
  {
      s = i ? String(&quot;11&quot;).SubString(1,1) : String(&quot;&quot;); // &lt;= '~*?&quot;!@Beee ;)
      s = i ? String(&quot;11&quot;, 1) : String(&quot;&quot;);  // &lt;= OK
  }
</code></pre>
<p>wird speicher von 5 mb auf 20 mb. hochgeschaufelt. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
<p>WinXP/BCB 6 Pro</p>
]]></description><link>https://www.c-plusplus.net/forum/post/431318</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/431318</guid><dc:creator><![CDATA[Xqgene]]></dc:creator><pubDate>Thu, 08 Jan 2004 08:01:12 GMT</pubDate></item><item><title><![CDATA[Reply to AnsiString verursacht Speicherlecks on Mon, 01 May 2006 07:43:27 GMT]]></title><description><![CDATA[<p>Wie schon im Titel angekündigt, scheint der Fehler beim BDS2006 beseitigt worden zu sein, der TestCode von Xqgene verursacht hier keine Speicherlecks mehr.</p>
<p>Das zur Info. <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/1048721</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1048721</guid><dc:creator><![CDATA[Burkhi]]></dc:creator><pubDate>Mon, 01 May 2006 07:43:27 GMT</pubDate></item><item><title><![CDATA[Reply to AnsiString verursacht Speicherlecks on Mon, 01 May 2006 09:40:24 GMT]]></title><description><![CDATA[<p>Schon bekannt ...</p>
<blockquote>
<p>...<br />
requires a type cast<br />
from char * to AnsiString, the compiler will allocate a temporary memory<br />
space to hold the string pointed to by char *, and call the function.<br />
However, the next time it comes back to the line, another temporary mem<br />
space is allocated.<br />
...</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1048776</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1048776</guid><dc:creator><![CDATA[bcbugger]]></dc:creator><pubDate>Mon, 01 May 2006 09:40:24 GMT</pubDate></item></channel></rss>