<?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[Wie funktioniert die Speicherverwaltung hinter std::strings ?]]></title><description><![CDATA[<p>Hallo C++ Board,<br />
ich würde mich zwar keinen richtigen Anfänger mehr nennen, habe aber trotzdem eine Grundlegende Frage, die mir immer noch nicht richtig klar wurde:</p>
<pre><code class="language-cpp">std::string str;
char* cstr1 = new char[10]; 
char* cstr2 = &quot;hallo&quot;;

// Frage 1:
delete [] cstr1; 
delete [] cstr2; // Ist der zweite String auch dynamisch ?

// Frage 2:
str = cstr1; 
delete [] cstr1; /* Benutzt str den Speicher von cstr1 weiter und wird er dann auch wieder von str freigegeben ? */

//Frage 3:
str = &quot;hallo&quot;;
cstr1 = str.c_str();// Bekomme ich hier nur den Pointer auf einen c string innerhalb von str ? 
delete [] cstr1; //  oder kann/muss ich den Speicher wieder selber freigeben ?
</code></pre>
<p>Ich hoffe ihr versteht was ich meine.<br />
Danke im voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/268329/wie-funktioniert-die-speicherverwaltung-hinter-std-strings</link><generator>RSS for Node</generator><lastBuildDate>Tue, 01 Sep 2026 21:04:25 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/268329.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 07 Jun 2010 17:33:07 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wie funktioniert die Speicherverwaltung hinter std::strings ? on Mon, 07 Jun 2010 17:33:28 GMT]]></title><description><![CDATA[<p>Hallo C++ Board,<br />
ich würde mich zwar keinen richtigen Anfänger mehr nennen, habe aber trotzdem eine Grundlegende Frage, die mir immer noch nicht richtig klar wurde:</p>
<pre><code class="language-cpp">std::string str;
char* cstr1 = new char[10]; 
char* cstr2 = &quot;hallo&quot;;

// Frage 1:
delete [] cstr1; 
delete [] cstr2; // Ist der zweite String auch dynamisch ?

// Frage 2:
str = cstr1; 
delete [] cstr1; /* Benutzt str den Speicher von cstr1 weiter und wird er dann auch wieder von str freigegeben ? */

//Frage 3:
str = &quot;hallo&quot;;
cstr1 = str.c_str();// Bekomme ich hier nur den Pointer auf einen c string innerhalb von str ? 
delete [] cstr1; //  oder kann/muss ich den Speicher wieder selber freigeben ?
</code></pre>
<p>Ich hoffe ihr versteht was ich meine.<br />
Danke im voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1908466</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1908466</guid><dc:creator><![CDATA[shorty0802]]></dc:creator><pubDate>Mon, 07 Jun 2010 17:33:28 GMT</pubDate></item><item><title><![CDATA[Reply to Wie funktioniert die Speicherverwaltung hinter std::strings ? on Mon, 07 Jun 2010 17:46:47 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">std::string str;
char* cstr1 = new char[10]; 
char* cstr2 = &quot;hallo&quot;; // &lt;- korrekt wäre const char* cstr2

// Frage 1:
delete [] cstr1; 
delete [] cstr2; // &lt;- SCHLECHT, da cstr2 nicht mit new[] angefordert wurde.
                 //    Stringliterale wie &quot;hallo&quot; räumen sich selbst auf.

// Frage 2:
str = cstr1; 
delete [] cstr1; // &lt;- SCHLECHT, da str die Zeichen kopiert und selbst verwaltet.
                 //    Du hast also zwei delete[] auf den selben Speicherbereich, nicht gut.

//Frage 3:
str = &quot;hallo&quot;;
cstr1 = str.c_str(); // &lt;- geht nicht, da c_str() einen Zeiger auf const char zurückgibt.
                     //    Aber ja, c_str() gäbe Lesezugriff auf einen C-String.
delete [] cstr1; // &lt;- SCHLECHT, der Speicher gehört nicht dir.
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1908471</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1908471</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 07 Jun 2010 17:46:47 GMT</pubDate></item><item><title><![CDATA[Reply to Wie funktioniert die Speicherverwaltung hinter std::strings ? on Mon, 07 Jun 2010 17:58:49 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<pre><code class="language-cpp">delete [] cstr1; // &lt;- SCHLECHT, da str die Zeichen kopiert und selbst verwaltet.
                 //    Du hast also zwei delete[] auf den selben Speicherbereich, nicht gut.
</code></pre>
</blockquote>
<p>Wenn der string aber den speicher kopiert, dann muss man es doch von hand löschen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1908486</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1908486</guid><dc:creator><![CDATA[möhbj]]></dc:creator><pubDate>Mon, 07 Jun 2010 17:58:49 GMT</pubDate></item><item><title><![CDATA[Reply to Wie funktioniert die Speicherverwaltung hinter std::strings ? on Mon, 07 Jun 2010 18:00:32 GMT]]></title><description><![CDATA[<p>Nein. Das übernimmt eben <code>std::string</code> für dich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1908489</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1908489</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 07 Jun 2010 18:00:32 GMT</pubDate></item><item><title><![CDATA[Reply to Wie funktioniert die Speicherverwaltung hinter std::strings ? on Mon, 07 Jun 2010 18:14:56 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Nein. Das übernimmt eben <code>std::string</code> für dich.</p>
</blockquote>
<p>In dem Fall aber doch nicht, weil sich str eine Kopie zieht, und nicht den cstr1-Zeiger als neuer Member nimmt.<br />
<a href="http://www.cplusplus.com/reference/string/string/operator=/" rel="nofollow">http://www.cplusplus.com/reference/string/string/operator=/</a><br />
cstr1 wird mit new[] erstellt, deshalb braucht es auch ein delete.<br />
(der Quote war ja auf das &quot;str = cstr1&quot;, und nicht &quot;cstr1 = str.c_str()&quot;).</p>
<p>Mist, auf den Zweiten Blick sehe ich aber trotzdem ein Problem.</p>
<pre><code class="language-cpp">char* cstr1 = new char[10];

// Frage 1:
delete [] cstr1;

// Frage 2:
str = cstr1;
delete [] cstr1;
</code></pre>
<p>Es ist ohne neue Erstellung ein zweiter delete auf einen bereits gelöschten Speicherbereich. Das geht definitiv schief.</p>
<p>BTW:</p>
<pre><code class="language-cpp">char* char_array = std_string.c_str();
</code></pre>
<p>wird eh nicht kompilieren, da eine Zuweisung des c_str() (=<strong>const</strong> char*) an char_array (=char*) nicht funktioniert. Dafür ist dann für den allernötigsten Ausnahmefall const_cast zu verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1908498</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1908498</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Mon, 07 Jun 2010 18:14:56 GMT</pubDate></item><item><title><![CDATA[Reply to Wie funktioniert die Speicherverwaltung hinter std::strings ? on Mon, 07 Jun 2010 18:28:00 GMT]]></title><description><![CDATA[<p>Anworten im Code</p>
<pre><code class="language-cpp">std::string str;
char* cstr1 = new char[10]; 
char* cstr2 = &quot;hallo&quot;;

// Frage 1:
delete [] cstr1; // ok, speicher ist freigegeben
delete [] cstr2; // Ist der zweite String auch dynamisch ?
// cstr2 zu löschen ergibt &quot;undefined behavior&quot;, d.h. man darf das nicht machen

// Frage 2:
str = cstr1; // undefined behavior, da cstr1 schon freigegeben ist
delete [] cstr1; /* Benutzt str den Speicher von cstr1 weiter und wird er dann auch wieder von str freigegeben ? */
// wieder undefined behavior

// Nachdem Speicher mit delete oder delete[] freigegeben worden ist, dürfen die Zeiger nicht mehr dereferenziert werden!

//Frage 3:
str = &quot;hallo&quot;;
cstr1 = str.c_str();// Bekomme ich hier nur den Pointer auf einen c string innerhalb von str ?
// ja,
delete [] cstr1; //  oder kann/muss ich den Speicher wieder selber freigeben ? 
// nein! der std::string verwaltet das für Dich. Es wird keinerlei Kopie angelegt, die vom außerhalb verwaltet werden müßte.
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1908508</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1908508</guid><dc:creator><![CDATA[*john 0]]></dc:creator><pubDate>Mon, 07 Jun 2010 18:28:00 GMT</pubDate></item><item><title><![CDATA[Reply to Wie funktioniert die Speicherverwaltung hinter std::strings ? on Tue, 08 Jun 2010 13:12:49 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Nein. Das übernimmt eben <code>std::string</code> für dich.</p>
</blockquote>
<p><code>cstr1</code> wurde mit <code>new[]</code> erzeugt und muss mit <code>delete []</code> gelöscht werden auch wenn sich ein <code>std::string</code> eine Kopie davon genommen hat. <code>string</code> verwaltet, wie du ja schon gesagt hast eine Kopie.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1908886</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1908886</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Tue, 08 Jun 2010 13:12:49 GMT</pubDate></item><item><title><![CDATA[Reply to Wie funktioniert die Speicherverwaltung hinter std::strings ? on Tue, 08 Jun 2010 13:28:52 GMT]]></title><description><![CDATA[<p>brotbernd schrieb:</p>
<blockquote>
<p>drakon schrieb:</p>
<blockquote>
<p>Nein. Das übernimmt eben <code>std::string</code> für dich.</p>
</blockquote>
<p><code>cstr1</code> wurde mit <code>new[]</code> erzeugt und muss mit <code>delete []</code> gelöscht werden auch wenn sich ein <code>std::string</code> eine Kopie davon genommen hat. <code>string</code> verwaltet, wie du ja schon gesagt hast eine Kopie.</p>
</blockquote>
<p>Ich habe das auch auf die Kopie bezogen.<br />
Die Kopie muss nicht mehr selbt verwaltet werden. Den ursprünglichen selbstverständlich doch (was er ja auch macht, auch wenn es fehlerhaft ist).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1908900</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1908900</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 08 Jun 2010 13:28:52 GMT</pubDate></item><item><title><![CDATA[Reply to Wie funktioniert die Speicherverwaltung hinter std::strings ? on Tue, 08 Jun 2010 13:47:18 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Ich habe das auch auf die Kopie bezogen.<br />
Die Kopie muss nicht mehr selbt verwaltet werden. Den ursprünglichen selbstverständlich doch (was er ja auch macht, auch wenn es fehlerhaft ist).</p>
</blockquote>
<p>Schon klar, dass du das so meintest. Mir schien blos als wäre die Frage anders gestellt gewesen und der Threadersteller durch die Antwort evtl. noch verwirrter <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>
<p>3 Fragen als zusammenhängenden Code darzustellen ist übrigens ziemlich verwirrend. Das hätte man besser trennen sollen. 3 mal cstr1 zu löschen sieht etwas seltsam aus, auch wenn man sich denken kann, dass es nicht als zusammenhängender Code gemeint war.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1908909</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1908909</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Tue, 08 Jun 2010 13:47:18 GMT</pubDate></item><item><title><![CDATA[Reply to Wie funktioniert die Speicherverwaltung hinter std::strings ? on Tue, 08 Jun 2010 14:02:21 GMT]]></title><description><![CDATA[<p>Ja ist wahrscheinlich schon nicht so übersichtlich geworden.</p>
<p>Mal sehen, ob shorty0802 noch fragen hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1908923</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1908923</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 08 Jun 2010 14:02:21 GMT</pubDate></item></channel></rss>