<?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 const char* myFunc()?]]></title><description><![CDATA[<p>Hi,</p>
<p>mich interessiert mal ein brennend. Wie ist die Rückgabegeschichte mit &quot;const char *&quot; in der STL realisiert?</p>
<p>Wenn ich z.B. :</p>
<pre><code class="language-cpp">const char *myFunc()
{
  std::string Blub = &quot;Blub&quot;;
  return Blub.c_str();
}
</code></pre>
<p>ausführe, ist mein &quot;Blub&quot; nach dem Aufruf nicht mehr gültig. Ist ja auch logisch, da &quot;std::string::c_str()&quot; nur einen Pointer auf den Inhalt des lokalen Objekts liefert.<br />
Also wie wurde das umgesetzt? Nehmen wir als Beispiele mal:<br />
&quot;const char *std::exception::what()&quot; oder &quot;const char *std::string::c_str()&quot;.</p>
<p>Ein Danke, jetzt schon mal.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/193651/wie-const-char-myfunc</link><generator>RSS for Node</generator><lastBuildDate>Mon, 28 Sep 2026 04:06:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/193651.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 28 Sep 2007 10:15:47 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wie const char* myFunc()? on Fri, 28 Sep 2007 10:15:47 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>mich interessiert mal ein brennend. Wie ist die Rückgabegeschichte mit &quot;const char *&quot; in der STL realisiert?</p>
<p>Wenn ich z.B. :</p>
<pre><code class="language-cpp">const char *myFunc()
{
  std::string Blub = &quot;Blub&quot;;
  return Blub.c_str();
}
</code></pre>
<p>ausführe, ist mein &quot;Blub&quot; nach dem Aufruf nicht mehr gültig. Ist ja auch logisch, da &quot;std::string::c_str()&quot; nur einen Pointer auf den Inhalt des lokalen Objekts liefert.<br />
Also wie wurde das umgesetzt? Nehmen wir als Beispiele mal:<br />
&quot;const char *std::exception::what()&quot; oder &quot;const char *std::string::c_str()&quot;.</p>
<p>Ein Danke, jetzt schon mal.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1374285</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374285</guid><dc:creator><![CDATA[Hö?]]></dc:creator><pubDate>Fri, 28 Sep 2007 10:15:47 GMT</pubDate></item><item><title><![CDATA[Reply to Wie const char* myFunc()? on Fri, 28 Sep 2007 10:19:35 GMT]]></title><description><![CDATA[<p>Klassenmethoden wie c_str() oder what() liefern normalerweise einen Zeiger auf interne Daten des this-Objekts. Ansonsten kannst du auch ein static char-Array zurückgeben oder den Speicher per new anfordern (in dem Fall wäre der Aufrufer verantwortlich, den Speicher freizugeben).</p>
<p>(und in C++ ist sowas sowieso unüblich - gibt lieber den zusammengebauten std::string aus anstelle seines char*-Puffers)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1374288</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374288</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 28 Sep 2007 10:19:35 GMT</pubDate></item><item><title><![CDATA[Reply to Wie const char* myFunc()? on Fri, 28 Sep 2007 10:20:15 GMT]]></title><description><![CDATA[<p>Die benutzen ein Member.<br />
Wenn Du eine Klasse hast, die so aussieht:</p>
<pre><code class="language-cpp">class Test
{
public:
    const char* what() const {return text.c_str();}
private:
    std::string text;
};
</code></pre>
<p>kannst Du es genauso machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1374289</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374289</guid><dc:creator><![CDATA[~Airdamn]]></dc:creator><pubDate>Fri, 28 Sep 2007 10:20:15 GMT</pubDate></item><item><title><![CDATA[Reply to Wie const char* myFunc()? on Fri, 28 Sep 2007 10:21:45 GMT]]></title><description><![CDATA[<p>Bei string::c_str() existiert das string-Objekt ja und gibt nur einen Zeiger auf seinen eigenen Speicher-Inhalt zurück. Der ist dann halt gültig, solange das string-Objekt existiert. Bei deiner Funktion geht ja das string-Objekt beim Ende der Funktion kaputt, dann ist der Zeiger nicht mehr gültig. Das selbe gilt für exception::what(), das hat intern halt auch einen string und solange die exception und damit auch der string darin existiert, ist auch der const char*-Zeiger gültig, den du bekommst <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/1374290</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374290</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Fri, 28 Sep 2007 10:21:45 GMT</pubDate></item><item><title><![CDATA[Reply to Wie const char* myFunc()? on Fri, 28 Sep 2007 10:38:00 GMT]]></title><description><![CDATA[<p>Hmm, also so was ähnliches hatte ich mir schon gedacht. Danke schön. <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/1374300</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374300</guid><dc:creator><![CDATA[Hö?]]></dc:creator><pubDate>Fri, 28 Sep 2007 10:38:00 GMT</pubDate></item><item><title><![CDATA[Reply to Wie const char* myFunc()? on Fri, 28 Sep 2007 10:42:57 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>...und in C++ ist sowas sowieso unüblich - gibt lieber den zusammengebauten std::string aus anstelle seines char*-Puffers</p>
</blockquote>
<p>Zu Recht, weil es diese ganezn &quot;Ownership-Probleme&quot; damit gibt. Als Außenstehender weiß ich ja gar nicht, ob ich deleten <em>muss</em> oder <em>nicht darf</em> oder das Zeug überhaupt noch gültig ist....</p>
<pre><code class="language-cpp">vector&lt;char*&gt; glob;
struct A { // verschiedenen Formen von &quot;interner char-Verwaltung&quot;
   char* internDynBuffer;
   char  internBuffer;

   string isInit_Dyn;
   static char* staticDynBuffer;
   string isInit;
   static char staticBuffer[100];

   size_t globIndex;

   A() {
      strncpy(internBuffer, &quot;Simon2&quot;, 100);

      internDynBuffer = new char[100];
      strncpy(internDynBuffer, &quot;Simon2&quot;, 100);

      if(isInit_Dyn == &quot;&quot;) {
         staticDynBuffer = new char[100];
         strncpy(staticDynBuffer, &quot;Simon2&quot;, 100);
         isInit_Dyn = &quot;true&quot;;
      }
      if(isInit == &quot;&quot;) {
         strncpy(staticBuffer, &quot;Simon2&quot;, 100);
         isInit = &quot;true&quot;;
      }

      globIndex = glob.size();
      glob.push_back(new char[100]);
      strncpy(glob[globIndex], &quot;Simon2&quot;, 100);
   }
   char* get1() const { return internDynBuffer; }
   char* get2() const { return internBuffer; }
   char* get3() const { return staticDynBuffer; }
   char* get4() const { return staticBuffer; }
   char* get5() const { return glob[globIndex]; }
   char* get6() const { return &quot;Simon2&quot;; }
};

void fill(A const&amp; a, vector&lt;char*&gt;&amp; v) {
   v.push_back(a.get1());
   v.push_back(a.get2());
   v.push_back(a.get3());
   v.push_back(a.get4());
   v.push_back(a.get5());
   v.push_back(a.get6());
}   

int main() {
   A a;
   vector&lt;char*&gt; v;
   fill(a, v);

   {
      B b;
      fill(a, v);
   }

   delete v[....// Naaaaa ? Welche sollen/müssen wir denn jetzt löschen ? Welche sind überhaupt gültig ?
</code></pre>
<p><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>
<p>Leider bringen Pointer diese Informationen nicht mit ... weswegen Konstrukte, die das selbst organisieren (z.B. shared-&quot;der Letzte macht das Licht aus&quot;-pointer aber auch std::string), besser sind.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1374303</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374303</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Fri, 28 Sep 2007 10:42:57 GMT</pubDate></item></channel></rss>