<?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[Rückgabe des Strings bei Exception: Korrekt?]]></title><description><![CDATA[<p>Ich hab eine Exception, die so aussieht:</p>
<pre><code class="language-cpp">class Exception : public std::exception
{
public:

    Exception(std::string message)
        : m_Message(message)
    {
    }

    virtual ~Exception() throw()
    {
    }

    virtual const char *what() const throw()
    {
        return m_Message.c_str();
    }

private:

	std::string m_Message;
};
</code></pre>
<p>Geht das mit dem <code>return m_Message.c_str()</code> in Ordnung oder kann das Probleme machen? Weil es ja sein kann, dass von außen der zurückgegebene String in eine Variable gepackt wird, die auch noch dann existiert, wenn der Scope der Exceptionvariable schon verlassen wurde.<br />
Falls es nicht geht: Wie müsste ich die Message sonst zurückgeben?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/270040/rückgabe-des-strings-bei-exception-korrekt</link><generator>RSS for Node</generator><lastBuildDate>Sun, 30 Aug 2026 19:01:20 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/270040.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 05 Jul 2010 16:55:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Rückgabe des Strings bei Exception: Korrekt? on Mon, 05 Jul 2010 16:55:50 GMT]]></title><description><![CDATA[<p>Ich hab eine Exception, die so aussieht:</p>
<pre><code class="language-cpp">class Exception : public std::exception
{
public:

    Exception(std::string message)
        : m_Message(message)
    {
    }

    virtual ~Exception() throw()
    {
    }

    virtual const char *what() const throw()
    {
        return m_Message.c_str();
    }

private:

	std::string m_Message;
};
</code></pre>
<p>Geht das mit dem <code>return m_Message.c_str()</code> in Ordnung oder kann das Probleme machen? Weil es ja sein kann, dass von außen der zurückgegebene String in eine Variable gepackt wird, die auch noch dann existiert, wenn der Scope der Exceptionvariable schon verlassen wurde.<br />
Falls es nicht geht: Wie müsste ich die Message sonst zurückgeben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921790</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921790</guid><dc:creator><![CDATA[RUN DOS RUN]]></dc:creator><pubDate>Mon, 05 Jul 2010 16:55:50 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabe des Strings bei Exception: Korrekt? on Mon, 05 Jul 2010 17:05:52 GMT]]></title><description><![CDATA[<p>Das geht in Ordnung. Wenn der Aufrufer den char* länger behalten möchte, als die Exceptionvariable gültig ist, muss er ihn eben kopieren. Genau so, wie man auch den Rückgabewert von c_str() kopieren muss, wenn er länger überleben soll, als der String selbst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921793</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921793</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Mon, 05 Jul 2010 17:05:52 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabe des Strings bei Exception: Korrekt? on Mon, 05 Jul 2010 17:58:35 GMT]]></title><description><![CDATA[<p>Theoretisch kann c_str() allerdings eine Exception werfen (beispielsweise std::bad_alloc), was wegen des throw()-Specifiers von what() zum Aufruf von std::unexpected führen würde.</p>
<p>Ich bin jetzt nicht darüber im Bilde, wie viele std::string-Implementationen aus c_str() Exceptions werfen; ich nehme an, dass es nicht besonders viele sind. Trotzdem wäre es streng genommen sauberer,</p>
<pre><code class="language-cpp">virtual char const *what() const throw() {
  char const *p = &quot;&quot;;

  try {
    p = m_message.c_str();
  } catch(...) { }

  return p;
}
</code></pre>
<p>oder etwas in der Art zu schreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921808</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921808</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Mon, 05 Jul 2010 17:58:35 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabe des Strings bei Exception: Korrekt? on Mon, 05 Jul 2010 20:02:45 GMT]]></title><description><![CDATA[<p>catch(...) ist nicht wirklich sauberer ...</p>
<p>Dennoch finde ich den Hinweis auf eine möglich exception von c_str() hilfreich.</p>
<p>Wobei es fraglich ist ob und wie man vernünftig,<br />
auf z.B. std::bad_alloc reagieren soll.</p>
<p>Das Programm zu beenden ist da nicht die schlechteste aller Strategien ...</p>
<p>Gruß Frank</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921903</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921903</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 05 Jul 2010 20:02:45 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabe des Strings bei Exception: Korrekt? on Mon, 05 Jul 2010 20:13:46 GMT]]></title><description><![CDATA[<p>[quote=&quot;seldon&quot;]Theoretisch kann c_str() allerdings eine Exception werfen (beispielsweise std::bad_alloc), was wegen des throw()-Specifiers von what() zum Aufruf von std::unexpected führen würde.<br />
[quote]</p>
<p><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="😮"
    /> Wie kann c_str() eine Exception werfen?<br />
std::string beinhaltet intern einen char*. Und c_str() macht ja nichts anderes als diesen char* in ein const char* zurückzugeben.</p>
<p>Verstehe ich da was falsch? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921908</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921908</guid><dc:creator><![CDATA[ÄhhhWTF?!]]></dc:creator><pubDate>Mon, 05 Jul 2010 20:13:46 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabe des Strings bei Exception: Korrekt? on Mon, 05 Jul 2010 20:38:32 GMT]]></title><description><![CDATA[<p>Frank Erdorf schrieb:</p>
<blockquote>
<p>Dennoch finde ich den Hinweis auf eine möglich exception von c_str() hilfreich.</p>
</blockquote>
<p>falls er denn stimmen sollte...</p>
<p>Generell schließe ich mich ÄhhhWTF?! an</p>
<p>Wo hast du die Info denn her?</p>
<p><a href="http://www.cplusplus.com/reference/string/string/c_str/" rel="nofollow">http://www.cplusplus.com/reference/string/string/c_str/</a></p>
<p>Hier sehe ich auch keinen Hinweis auf eine potentielle Exception</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921926</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921926</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 05 Jul 2010 20:38:32 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabe des Strings bei Exception: Korrekt? on Mon, 05 Jul 2010 20:39:37 GMT]]></title><description><![CDATA[<blockquote>
<p>std::string beinhaltet intern einen char*. Und c_str() macht ja nichts anderes als diesen char* in ein const char* zurückzugeben.</p>
</blockquote>
<p>So ist es warscheinlich implementiert, aber es ist nicht so festgelegt!</p>
<p>Ich habe es auch schon mal so angenommen und unter 5 Kompilern keine Probleme gehabt - was nich bedeutet das auch IMMER so ist.</p>
<p>Gruß Frank</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921931</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921931</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 05 Jul 2010 20:39:37 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabe des Strings bei Exception: Korrekt? on Mon, 05 Jul 2010 20:43:56 GMT]]></title><description><![CDATA[<p>In vielen Implementationen ist das so, aber es ist vom Standard nicht zwingend vorgegeben und auch nicht überall der Fall; c_str() wird dort sogar explizit als eine der Funktionen genannt, die den internen Status eines Strings verändern dürfen (wodurch Zeiger, Referenzen und Iteratoren auf seine Interna invalidiert werden).</p>
<p>Etwa könnte ein std::string auf den Sentinel verzichten, bis c_str() zum ersten mal aufgerufen wird - beispielsweise bei Blockbehandlung, wenn Paging eine Rolle spielt (std::string ist nicht nullterminiert) oder zum Speichersparen bei kurzen Strings. Oder er könnte im Backend eine deque benutzen, um Anhängen/Abhängen an beiden Enden schneller zu machen - std::string garantiert nicht, dass seine Daten in einem zusammenhängenden Speicherstück liegen. Oder es könnte bei einer referenzzählenden Implementation (diese Möglichkeit wird im Standard explizit benannt) Gründe geben, sich beim Aufruf von c_str() aus dem gemeinsamen Datenpool zu lösen.</p>
<p>Meistens wird das wohl nicht gemacht, aber der Standard gibt für c_str() keine nothrow-Garantie, um den Bibliotheksentwicklern Freiräume zu lassen. Und man sollte davon ausgehen, dass ein moderner Compiler den Try-Block, wenn er nachweisen kann, dass c_str() nicht wirft, eh wegoptimiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921937</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921937</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Mon, 05 Jul 2010 20:43:56 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabe des Strings bei Exception: Korrekt? on Mon, 05 Jul 2010 20:48:14 GMT]]></title><description><![CDATA[<p>Frank Erdorf schrieb:</p>
<blockquote>
<blockquote>
<p>std::string beinhaltet intern einen char*. Und c_str() macht ja nichts anderes als diesen char* in ein const char* zurückzugeben.</p>
</blockquote>
<p>So ist es warscheinlich implementiert, aber es ist nicht so festgelegt!</p>
<p>Ich habe es auch schon mal so angenommen und unter 5 Kompilern keine Probleme gehabt - was nich bedeutet das auch IMMER so ist.</p>
<p>Gruß Frank</p>
</blockquote>
<blockquote>
<p>§17.4.4.8/3: &quot;Any other function [than destructors] defined in the<br />
C++ Standard Library that do not have an exception-specification may<br />
throw implementation-defined exceptions unless otherwise specified</p>
</blockquote>
<p>Okay...</p>
<p>Für mich persönlich wird diese Tatsache allerdings nichts an meinem<br />
Programmierverhalten ändern...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921939</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921939</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 05 Jul 2010 20:48:14 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabe des Strings bei Exception: Korrekt? on Mon, 05 Jul 2010 21:03:49 GMT]]></title><description><![CDATA[<p>Schreib dir halt ne Funktionsvorlage</p>
<pre><code class="language-cpp">template&lt;typename string_type&gt;
char const *c_str_nothrow(string_type const &amp;s) throw() {
  char const *p = &quot;Fehler beim Holen der Fehlermeldung&quot;; // o.ä.

  try {
    p = s.c_str();
  } catch(...) { }

  return p;
}
</code></pre>
<p>und in der Exception</p>
<pre><code class="language-cpp">virtual char const *what() const throw() {
  return c_str_nothrow(m_message);
}
</code></pre>
<p>Das sollte ja nun wirklich beherrschbar sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921949</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921949</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Mon, 05 Jul 2010 21:03:49 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabe des Strings bei Exception: Korrekt? on Mon, 05 Jul 2010 21:06:14 GMT]]></title><description><![CDATA[<p>CSpille schrieb:</p>
<blockquote>
<p>Okay...</p>
<p>Für mich persönlich wird diese Tatsache allerdings nichts an meinem<br />
Programmierverhalten ändern...</p>
</blockquote>
<p>Gleichfalls, trotzdem nett zu wissen. An dieser Stelle bedanke ich mich! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921951</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921951</guid><dc:creator><![CDATA[ÄhhhWTF?!]]></dc:creator><pubDate>Mon, 05 Jul 2010 21:06:14 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabe des Strings bei Exception: Korrekt? on Mon, 05 Jul 2010 21:12:05 GMT]]></title><description><![CDATA[<p>seldon schrieb:</p>
<blockquote>
<p>Das sollte ja nun wirklich beherrschbar sein.</p>
</blockquote>
<p>Hast du absolut recht...</p>
<p>Allerdings werde ich grundsätzlich nicht meinen Programmiercode<br />
für irgendwelche Wurst-Compiler anpassen.</p>
<p>Mir reicht es, wenn mein Code auf dem gcc compiliert, denn<br />
den gibt es notfalls auch für fast alle gängigen Plattformen.</p>
<p>Als Beispiel:<br />
Ich verwende 0 statt NULL.<br />
Wenn irgendein Wurst-Compiler jetzt 0xdeadbeef als NULL verwendet,<br />
würden alle if(ptr) in die Hose gehen.<br />
Aber ehrlich gesagt ist mir das s*** egal...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921954</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921954</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 05 Jul 2010 21:12:05 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabe des Strings bei Exception: Korrekt? on Mon, 05 Jul 2010 21:16:23 GMT]]></title><description><![CDATA[<p>Exception Specifications zu verwenden ist generell etwas fragwürdig (unabhängig vom Beispiel hier).<br />
<a href="http://www.gotw.ca/publications/mill22.htm" rel="nofollow">http://www.gotw.ca/publications/mill22.htm</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921958</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921958</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 05 Jul 2010 21:16:23 GMT</pubDate></item></channel></rss>