<?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[std::string gibt Speicher nicht frei?]]></title><description><![CDATA[<p>Moin!<br />
Ich entwickle hier derzeit auf einer Linux-Box mit g++ 3.3.5. Ich versuche mir gerade eine Art kleines Testframework für Unit-Tests zu schreiben. Natürlich will ich auch Speicherlecks ausfindig machen. Also habe ich new und delete komplett überschrieben. Dort gibt es eine Variable, die bei jedem new()-Aufruf um eins erhöht wird und bei jedem delete()-Aufruf um eins erniedrigt wird.<br />
Nach dem Durchlaufen aller Tests war die Differenz ungleich 0. Das machte mich stutzig und ich fing sofort an, nach Speicherlöchern zu suchen. Ich habe alles mögliche ausprobiert und konnte den Fehler mit Auskommentieren von Quellcode lokalisieren. Anscheinend gibt std::string angeforderten Speicher nicht frei. Sieht zumindest so aus. Allerdings ist das Verhalten sehr merkwürdig.</p>
<p>Hier ein paar Beispiele dazu:</p>
<pre><code class="language-cpp">void foo()
{
   std::string str = &quot;bla&quot;;
} //es fehlt ein delete-Aufruf

void bar()
{
   std::string str = &quot;bla&quot;;
   str = &quot;jkkljjkl&quot;;
} //es fehlt ein delete-Aufruf

void foobar()
{
   std::string s1 = &quot;bla&quot;;
   std::string s2 = &quot;blubb&quot;
} //Es fehlt auch nur genau ein delete Aufruf...
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/154149/std-string-gibt-speicher-nicht-frei</link><generator>RSS for Node</generator><lastBuildDate>Mon, 07 Sep 2026 23:34:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/154149.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 24 Jul 2006 19:55:24 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::string gibt Speicher nicht frei? on Mon, 24 Jul 2006 19:55:24 GMT]]></title><description><![CDATA[<p>Moin!<br />
Ich entwickle hier derzeit auf einer Linux-Box mit g++ 3.3.5. Ich versuche mir gerade eine Art kleines Testframework für Unit-Tests zu schreiben. Natürlich will ich auch Speicherlecks ausfindig machen. Also habe ich new und delete komplett überschrieben. Dort gibt es eine Variable, die bei jedem new()-Aufruf um eins erhöht wird und bei jedem delete()-Aufruf um eins erniedrigt wird.<br />
Nach dem Durchlaufen aller Tests war die Differenz ungleich 0. Das machte mich stutzig und ich fing sofort an, nach Speicherlöchern zu suchen. Ich habe alles mögliche ausprobiert und konnte den Fehler mit Auskommentieren von Quellcode lokalisieren. Anscheinend gibt std::string angeforderten Speicher nicht frei. Sieht zumindest so aus. Allerdings ist das Verhalten sehr merkwürdig.</p>
<p>Hier ein paar Beispiele dazu:</p>
<pre><code class="language-cpp">void foo()
{
   std::string str = &quot;bla&quot;;
} //es fehlt ein delete-Aufruf

void bar()
{
   std::string str = &quot;bla&quot;;
   str = &quot;jkkljjkl&quot;;
} //es fehlt ein delete-Aufruf

void foobar()
{
   std::string s1 = &quot;bla&quot;;
   std::string s2 = &quot;blubb&quot;
} //Es fehlt auch nur genau ein delete Aufruf...
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1103426</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1103426</guid><dc:creator><![CDATA[hackbert]]></dc:creator><pubDate>Mon, 24 Jul 2006 19:55:24 GMT</pubDate></item><item><title><![CDATA[Reply to std::string gibt Speicher nicht frei? on Mon, 24 Jul 2006 20:11:28 GMT]]></title><description><![CDATA[<p>Und ganz ohne einen String anzulegen?</p>
<p>Kann mir vorstellen, dass dort irgendein statischer Zeiger mit einem Stück Heap gefüllt wird, welches aber aufgrund der Tatsache dass es nur <strong>einmal</strong> jemals angefordert wird nicht abgeräumt wird. Unter Linux geht man ja generell davon aus dass zum Programmende wirklich alles dem Betriebssystem zurückgegeben wird, auch bei Speicherlecks (auch wenn das imho eine Nachlässigkeit in der Lib wäre).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1103436</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1103436</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Mon, 24 Jul 2006 20:11:28 GMT</pubDate></item><item><title><![CDATA[Reply to std::string gibt Speicher nicht frei? on Mon, 24 Jul 2006 21:22:54 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">string::clear()
</code></pre>
<p><a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcstdlib/html/vclrf_string_basicstringclear.asp" rel="nofollow">http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcstdlib/html/vclrf_string_basicstringclear.asp</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1103484</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1103484</guid><dc:creator><![CDATA[Erhard Henkes]]></dc:creator><pubDate>Mon, 24 Jul 2006 21:22:54 GMT</pubDate></item><item><title><![CDATA[Reply to std::string gibt Speicher nicht frei? on Mon, 24 Jul 2006 21:45:15 GMT]]></title><description><![CDATA[<p>Schon mal die Implementation von std::string angeschaut? Oder mit dem Debugger durchgesteppt?<br />
Und wie schauen die Signaturen deiner überladenen Operatoren aus?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1103494</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1103494</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Mon, 24 Jul 2006 21:45:15 GMT</pubDate></item><item><title><![CDATA[Reply to std::string gibt Speicher nicht frei? on Tue, 25 Jul 2006 08:23:15 GMT]]></title><description><![CDATA[<p>string::clear() löscht zwar den Inhalt der Stringvariablen, verringert/löscht aber nicht den dafür verwendeten Speicher.<br />
Das geht z.Bsp. so</p>
<pre><code class="language-cpp">string test(&quot;Irgend ein String&quot;);
//Speicher freigeben
string().swap(test);
</code></pre>
<p>Bist du sicher, dass deine string-Implementation überhaupt new/delete verwendet?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1103599</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1103599</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Tue, 25 Jul 2006 08:23:15 GMT</pubDate></item><item><title><![CDATA[Reply to std::string gibt Speicher nicht frei? on Tue, 25 Jul 2006 13:42:41 GMT]]></title><description><![CDATA[<p>Ich habe hier gerade noch ein paar sehr Merkwürdige Fehler entdeckt. Ich habe mir mal die Adressen der nicht freigegebenen Pointer ausgeben lassen und mal geschaut, wo die herkommen. Bei manchen ist ganz klar per Debugger nachvollziehbar, dass sie mittels delete wieder freigegeben werden.<br />
Ein Beispiel: Ich habe einen vector aus MathNode* Pointer. Also so: std::vector&lt;MathNode*&gt;. Irgendwann werden alle Objekte gelöscht, auf die eine Referenz im Vektor gehalten wurde:</p>
<pre><code class="language-cpp">/*bgein() und end() gehören zu der Klasse, in der die Schleife verwendet wird und geben begin() und end() des Vectors zurück...*/
for(std::vector&lt;MathNode*&gt;::iterator it = begin(); it != end(); ++it)
		delete (*it);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1103873</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1103873</guid><dc:creator><![CDATA[hackbert]]></dc:creator><pubDate>Tue, 25 Jul 2006 13:42:41 GMT</pubDate></item><item><title><![CDATA[Reply to std::string gibt Speicher nicht frei? on Tue, 25 Jul 2006 21:47:50 GMT]]></title><description><![CDATA[<p>Nach ein Bisschen Forschung ist mir nun aufgefallen, dass std::vector anscheinend Speicher belegt, sobald man ein Objekt mittels push_back() einfügt. Allerdings wird dieser Speicher wie auf wundersame Weise nicht freigegeben...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1104230</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1104230</guid><dc:creator><![CDATA[hackbert]]></dc:creator><pubDate>Tue, 25 Jul 2006 21:47:50 GMT</pubDate></item><item><title><![CDATA[Reply to std::string gibt Speicher nicht frei? on Tue, 25 Jul 2006 22:55:23 GMT]]></title><description><![CDATA[<p>schau mal hier: <a href="http://www.henkessoft.de/C++/C++%20Fortgeschrittene/C++_Fortgeschrittene.htm#2.3._Unsere_Testklasse_im_Container" rel="nofollow">http://www.henkessoft.de/C++/C++ Fortgeschrittene/C++_Fortgeschrittene.htm#2.3._Unsere_Testklasse_im_Container</a><br />
Vielleicht bringt dich das weiter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1104252</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1104252</guid><dc:creator><![CDATA[hew]]></dc:creator><pubDate>Tue, 25 Jul 2006 22:55:23 GMT</pubDate></item><item><title><![CDATA[Reply to std::string gibt Speicher nicht frei? on Wed, 26 Jul 2006 07:32:26 GMT]]></title><description><![CDATA[<p>hmmm... nicht so wirklich.<br />
Ich habe nochmal ein Bisschen mit dem Debugger geschaut, wo genau der Speicher reserviert wird. Mehrere STL-Komponenten reservieren anscheinend Speicher im Voraus. Hier mal ein Stack-Trace bis zur Reservierung des Speichers, der nicht freigegeben wird.</p>
<p>Ein vector, der beim ersten push_back() Speicher reserviert:</p>
<pre><code>13 operator new() at ../tests/NewDeleteOperator.cpp:74 0x0804e4be
12 std::__default_alloc_template&lt;true, 0&gt;::_S_chunk_alloc()  0xb7f65a6b
11 std::__default_alloc_template&lt;true, 0&gt;::_S_refill()  0xb7f6597d
10 std::__default_alloc_template&lt;true, 0&gt;::allocate()  0xb7f65678
9 std::__simple_alloc&lt;MathNode*, std::__default_alloc_template&lt;true, 0&gt; &gt;::allocate() at stl_alloc.h:232 0x08056b8d
8 std::_Vector_alloc_base&lt;MathNode*, std::allocator&lt;MathNode*&gt;, true&gt;::_M_allocate() at stl_vector.h:127 0x08056b69
7 std::vector&lt;MathNode*, std::allocator&lt;MathNode*&gt; &gt;::_M_insert_aux() at vector.tcc:236 0x080566dc
6 std::vector&lt;MathNode*, std::allocator&lt;MathNode*&gt; &gt;::push_back() at stl_vector.h:603 0x080561c8
</code></pre>
<p>Eine Map, die Speicher reserviert:</p>
<pre><code>14 operator new() at ../tests/NewDeleteOperator.cpp:74 0x0804e4be
13 std::__default_alloc_template&lt;true, 0&gt;::_S_chunk_alloc()  0xb7f29a6b
12 std::__default_alloc_template&lt;true, 0&gt;::_S_refill()  0xb7f2997d
11 std::__default_alloc_template&lt;true, 0&gt;::allocate()  0xb7f29678
10 std::__simple_alloc&lt;std::_Rb_tree_node&lt;std::pair&lt;std::string const, Number*&gt; &gt;, std::__default_alloc_template&lt;true, 0&gt; &gt;::allocate() at stl_alloc.h:232 0x080576a5
9 std::_Rb_tree_alloc_base&lt;std::pair&lt;std::string const, Number*&gt;, std::allocator&lt;std::pair&lt;std::string const, Number*&gt; &gt;, true&gt;::_M_get_node() at stl_tree.h:564 0x08057678
8 _Rb_tree_base() at stl_tree.h:579 0x0805764f
7 _Rb_tree() at stl_tree.h:730 0x08057610
6 map() at stl_map.h:144 0x080575b9
.
.
.
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1104309</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1104309</guid><dc:creator><![CDATA[hackbert]]></dc:creator><pubDate>Wed, 26 Jul 2006 07:32:26 GMT</pubDate></item><item><title><![CDATA[Reply to std::string gibt Speicher nicht frei? on Wed, 26 Jul 2006 08:28:18 GMT]]></title><description><![CDATA[<p>Wie verhält sich deine Testroutine in Bezug auf statische Objekte, die mit new angelegt worden sind?<br />
Verwendet man z.B. Autopointer zum Löschen dieser Objekte weiss man nicht unbedingt zu welchen Zeitpunkt diese gelöscht werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1104339</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1104339</guid><dc:creator><![CDATA[Mathias]]></dc:creator><pubDate>Wed, 26 Jul 2006 08:28:18 GMT</pubDate></item><item><title><![CDATA[Reply to std::string gibt Speicher nicht frei? on Thu, 27 Jul 2006 06:56:50 GMT]]></title><description><![CDATA[<p>Habe ich noch nicht ausprobiert, weil ich derzeit keine autopointer verwende. Was mir wirklich nützen würde wäre eine Funktion, mit der ich der STL sagen kann, dass Sie allen reservierten Speicher freigeben soll..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1105051</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1105051</guid><dc:creator><![CDATA[hackbert]]></dc:creator><pubDate>Thu, 27 Jul 2006 06:56:50 GMT</pubDate></item><item><title><![CDATA[Reply to std::string gibt Speicher nicht frei? on Thu, 27 Jul 2006 07:21:27 GMT]]></title><description><![CDATA[<p>Wenn du feststellen möchtest ob alles korrekt freigegeben worden ist, kannst du dies mit oder ohne STL erst dann sagen, wenn das zu testende Programm beendet wurde.<br />
(Es sei denn du verzichtest gänzlich auf statische Strukturen und Bibliotheken, die solche intern nutzen.)</p>
<p>Das automatische Erkennen von Speicherleaks ist nunmal nicht so ganz einfach, ansonsten würde wohl keiner die sehr günstigen *hust* Analysewerkzeuge zum Finden von Speicherleaks kaufen. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1105065</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1105065</guid><dc:creator><![CDATA[Mathias]]></dc:creator><pubDate>Thu, 27 Jul 2006 07:21:27 GMT</pubDate></item><item><title><![CDATA[Reply to std::string gibt Speicher nicht frei? on Thu, 27 Jul 2006 15:34:24 GMT]]></title><description><![CDATA[<p>Mathias schrieb:</p>
<blockquote>
<p>Das automatische Erkennen von Speicherleaks ist nunmal nicht so ganz einfach</p>
</blockquote>
<p>Naja, eigentlich schon. Du musst es halt blos in die Anwendung implementieren, und nicht hinterher versuchen, das irgendwie auf die Reihe zu bekommen. Ist bei mir gerade mal eine Headerdatei mit überladenen Operatoren new/delete und 'ner Trace Klasse.</p>
<p>Ohne hackbert nahetreten zu wollen, ich glaube nicht, dass seine STL Implementation Speicherlecks verursacht. Obwohl ich darauf nicht wetten würde, immerhin werkelt er unter Linux. <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="😃"
    /> Ich glaube er hat irgendwo 'nen Denkfehler. Oder irgendeine krumme Geschichte ist bei seinen Tests mit im Spiel. Wann wird denn deine Zählvariable ausgegeben? Ein Problem bei mir war zB, dass ich meine Ergebnisse ausgegeben hatte, obwohl noch nicht alle Speicherfreigaben erfolgt waren. Grund dafür waren Objekte mit statischer Lebensdauer, deren ctor erst nach dem ctor meiner Trace Klasse aufgerufen worden. Evtl. ist es ein ähnliches Problem bei hackbert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1105502</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1105502</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Thu, 27 Jul 2006 15:34:24 GMT</pubDate></item></channel></rss>