<?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[Implementation der c_str()-Funktion?]]></title><description><![CDATA[<p>Hi, mal angenommen ich habe eine String-Klasse in der ich alle Zeichen nicht null-terminiert in einem Vector speichere.<br />
Wie würde man nun eine Funktion implementieren die einen wchar_t* zurückgibt?<br />
Beim std::string wird ein dynamisches Array erstellt und mit Kopien der Zeichen plus angehängtes '\0' zurückgegeben. Allerdings weis ich nicht wie man dann dafür sorgen kann dass dieser C-String auch wieder freigegeben wird. Jemand eine Idee? Evtl. Smartpointer?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/289293/implementation-der-c_str-funktion</link><generator>RSS for Node</generator><lastBuildDate>Wed, 19 Aug 2026 05:44:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/289293.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 01 Jul 2011 23:14:27 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Implementation der c_str()-Funktion? on Fri, 01 Jul 2011 23:14:27 GMT]]></title><description><![CDATA[<p>Hi, mal angenommen ich habe eine String-Klasse in der ich alle Zeichen nicht null-terminiert in einem Vector speichere.<br />
Wie würde man nun eine Funktion implementieren die einen wchar_t* zurückgibt?<br />
Beim std::string wird ein dynamisches Array erstellt und mit Kopien der Zeichen plus angehängtes '\0' zurückgegeben. Allerdings weis ich nicht wie man dann dafür sorgen kann dass dieser C-String auch wieder freigegeben wird. Jemand eine Idee? Evtl. Smartpointer?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2087508</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2087508</guid><dc:creator><![CDATA[Fine]]></dc:creator><pubDate>Fri, 01 Jul 2011 23:14:27 GMT</pubDate></item><item><title><![CDATA[Reply to Implementation der c_str()-Funktion? on Fri, 01 Jul 2011 23:18:06 GMT]]></title><description><![CDATA[<p>Ich denke nicht, daß die string::c_str()-Methode den Speicher kopiert - sie reserviert nur genug Speicher für den zusätzlichen Null-Terminator und arbeitet nach dem Aufruf mit diesem Speicher weiter. (wobei string sich sowieso etwas Luft nach oben lässt - siehe reserve()/capacity())</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2087509</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2087509</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 01 Jul 2011 23:18:06 GMT</pubDate></item><item><title><![CDATA[Reply to Implementation der c_str()-Funktion? on Fri, 01 Jul 2011 23:29:24 GMT]]></title><description><![CDATA[<p>@ CStoll:</p>
<blockquote>
<p>Ich denke nicht, daß die string::c_str()-Methode den Speicher kopiert</p>
</blockquote>
<p>Hast recht mit deinem Denken <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>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;

using namespace std;

int main()
{
    string cpp = &quot;Hallo Welt.&quot;;
    char* c = const_cast&lt;char *&gt;(cpp.c_str());
    cout &lt;&lt; cpp &lt;&lt; endl &lt;&lt; c &lt;&lt; endl &lt;&lt; endl; // Hallo Welt.   Hallo Welt.
    *(c + 2) = 'x';
    cout &lt;&lt; cpp &lt;&lt; endl &lt;&lt; c &lt;&lt; endl &lt;&lt; endl; // Haxlo Welt.   Haxlo Welt.
    return 0;
}
</code></pre>
<p>Ruft man allerdings vorher &quot;reserve&quot; auf, wird der C-String vom C++-String getrennt. Ist ja auch logisch <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/2087515</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2087515</guid><dc:creator><![CDATA[Wurstinator]]></dc:creator><pubDate>Fri, 01 Jul 2011 23:29:24 GMT</pubDate></item><item><title><![CDATA[Reply to Implementation der c_str()-Funktion? on Fri, 01 Jul 2011 23:30:05 GMT]]></title><description><![CDATA[<p>Achso, ich hatte das zumindest hier so rausgelesen:<br />
<a href="http://www.cplusplus.com/reference/string/string/c_str/" rel="nofollow">http://www.cplusplus.com/reference/string/string/c_str/</a><br />
Aber du hast recht. Ich brauche ja nur dafür zu sorgen, dass die Capacity mindestens ein Zeichen größer als die Size ist und diesem reservierten Zeichen dann den Wert '\0' zuordnen.<br />
Allerdings könnte das großen Murks geben wenn dieser String verändert würde und weiterhin ein Pointer auf den Inhalt zeigt. Aber das ist beim std::string wenn ich den Artikel oben richtig interpretiere auch nicht anders.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2087516</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2087516</guid><dc:creator><![CDATA[Fine]]></dc:creator><pubDate>Fri, 01 Jul 2011 23:30:05 GMT</pubDate></item><item><title><![CDATA[Reply to Implementation der c_str()-Funktion? on Fri, 01 Jul 2011 23:35:44 GMT]]></title><description><![CDATA[<p>Wurstinator schrieb:</p>
<blockquote>
<p>Ruft man allerdings vorher &quot;reserve&quot; auf, wird der C-String vom C++-String getrennt. Ist ja auch logisch <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>
</blockquote>
<p>Schlimmer - beim reserve werden bestehende Verweise in die String-Inhalte (inklusive des von c_str() zurückgelieferten Zeigers) ungültig - wenn du dann noch darauf zugreifst, ergibt das undefiniertes Verhalten.</p>
<p>@Fine: Für die Fälle, wo du das logisch trennen willst, gibt es auch string::copy() - und da ist der Anwender dafür verantwortlich, genug Speicher bereitzustellen (und wieder aufzuräumen).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2087517</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2087517</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 01 Jul 2011 23:35:44 GMT</pubDate></item><item><title><![CDATA[Reply to Implementation der c_str()-Funktion? on Fri, 01 Jul 2011 23:49:01 GMT]]></title><description><![CDATA[<p>Ich denke die üblichen std::string Implementierungen werden so gebaut sein, dass sie den String immer Nullterminiert bereithalten.<br />
c_str() macht in dem Fall genau gar nix, ausser den Zeiger auf den aktuellen String-Inhalt zurückzugeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2087521</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2087521</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 01 Jul 2011 23:49:01 GMT</pubDate></item></channel></rss>