<?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[stringstream und c_str()]]></title><description><![CDATA[<pre><code class="language-cpp">const char *Exception::what() const throw() {

	std::stringstream test;
	std::string       message;

	ss &lt;&lt; &quot;Exception: &quot; &lt;&lt; error_msg &lt;&lt; &quot; - Code: &quot; &lt;&lt; code;
	message = ss.str();

	return message.c_str();
}
</code></pre>
<p>Wenn ich in meiner main()-Funktion jetzt what() aufrufe bekomme ich nur kryptische Zeichen heraus, wenn ich den string message noch in der Funktion ausgeben lasse funktioniert alles einwandfrei. Was kann denn bei dem message.c_str() so schief laufen, dass ich nur noch Schrott rausbekomme?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/307681/stringstream-und-c_str</link><generator>RSS for Node</generator><lastBuildDate>Thu, 06 Aug 2026 15:50:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/307681.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 02 Sep 2012 12:50:58 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to stringstream und c_str() on Sun, 02 Sep 2012 12:50:58 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">const char *Exception::what() const throw() {

	std::stringstream test;
	std::string       message;

	ss &lt;&lt; &quot;Exception: &quot; &lt;&lt; error_msg &lt;&lt; &quot; - Code: &quot; &lt;&lt; code;
	message = ss.str();

	return message.c_str();
}
</code></pre>
<p>Wenn ich in meiner main()-Funktion jetzt what() aufrufe bekomme ich nur kryptische Zeichen heraus, wenn ich den string message noch in der Funktion ausgeben lasse funktioniert alles einwandfrei. Was kann denn bei dem message.c_str() so schief laufen, dass ich nur noch Schrott rausbekomme?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247826</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247826</guid><dc:creator><![CDATA[knuffimaus]]></dc:creator><pubDate>Sun, 02 Sep 2012 12:50:58 GMT</pubDate></item><item><title><![CDATA[Reply to stringstream und c_str() on Sun, 02 Sep 2012 12:57:55 GMT]]></title><description><![CDATA[<p>Wann wird das, worauf c_str zeigt, gelöscht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247828</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247828</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Sun, 02 Sep 2012 12:57:55 GMT</pubDate></item><item><title><![CDATA[Reply to stringstream und c_str() on Sun, 02 Sep 2012 13:05:07 GMT]]></title><description><![CDATA[<p>Oh man wie peinlich, da sieht man den Wald vor lauter Bäumen nicht.<br />
Es sollte also reichen std::string message als static zu deklarieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247829</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247829</guid><dc:creator><![CDATA[knuffimaus]]></dc:creator><pubDate>Sun, 02 Sep 2012 13:05:07 GMT</pubDate></item><item><title><![CDATA[Reply to stringstream und c_str() on Sun, 02 Sep 2012 13:09:30 GMT]]></title><description><![CDATA[<p>Nein, du kannst höchstens den string als Member der Exceptionklasse nehmen. Was man aber vermeiden sollte, wenn die Speicherallokation fehlschlägt, dann kracht es bei der Behandlung der Exception.</p>
<p>Warscheinlich bin ich der Einzige, der es so machen würde, aber so finde ich es am Besten:</p>
<p>1. Verpasse der Excpetionklasse einen Buffer mit statischer Größe, zb 4096.<br />
2. Schreibe mit ssprintf in den Buffer.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247830</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247830</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Sun, 02 Sep 2012 13:09:30 GMT</pubDate></item><item><title><![CDATA[Reply to stringstream und c_str() on Sun, 02 Sep 2012 13:51:37 GMT]]></title><description><![CDATA[<p>Ethon schrieb:</p>
<blockquote>
<p>Was man aber vermeiden sollte, wenn die Speicherallokation fehlschlägt, dann kracht es bei der Behandlung der Exception.</p>
</blockquote>
<p>Die wenigsten Exceptions fliegen, weil es keinen Speicher mehr gibt. Entsprechend unangebracht finde ich die Verkomplizierung sämtlicher Exception-Implementierungen.</p>
<p><code>std::runtime_error</code> wird beispielsweise auch von einem <code>std::string</code> konstruiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247834</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247834</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 02 Sep 2012 13:51:37 GMT</pubDate></item><item><title><![CDATA[Reply to stringstream und c_str() on Sun, 02 Sep 2012 14:05:17 GMT]]></title><description><![CDATA[<p>Im übrigen würde ich std::ostringstream statt std::stringstream verwenden. Du willst ja nichts aus dem String lesen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247839</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247839</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Sun, 02 Sep 2012 14:05:17 GMT</pubDate></item><item><title><![CDATA[Reply to stringstream und c_str() on Sun, 02 Sep 2012 14:19:27 GMT]]></title><description><![CDATA[<p>Wenn ich jetzt eine neue Membervariable mache:</p>
<pre><code class="language-cpp">protected:
   std::string msg;
</code></pre>
<p>Sagt der Compiler hierzu nein:</p>
<pre><code class="language-cpp">std::ostringstream  ss;

	ss &lt;&lt; &quot;Exception: &quot; &lt;&lt; error_msg &lt;&lt; &quot; - Errorcode: &quot; &lt;&lt; error_code;
	msg = ss.str();

	return msg.c_str();
}
</code></pre>
<p>Binärer Operator '=': Es konnte kein Operator gefunden werden, der einen linksseitigen Operanden vom Typ 'const std::string' akzeptiert (oder keine geeignete Konvertierung möglich)</p>
<p>Wieso wandelt der meinen string in einen const string um?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247846</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247846</guid><dc:creator><![CDATA[knuffimaus]]></dc:creator><pubDate>Sun, 02 Sep 2012 14:19:27 GMT</pubDate></item><item><title><![CDATA[Reply to stringstream und c_str() on Sun, 02 Sep 2012 14:21:45 GMT]]></title><description><![CDATA[<p>#include &lt;string&gt; drin?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247847</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247847</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Sun, 02 Sep 2012 14:21:45 GMT</pubDate></item><item><title><![CDATA[Reply to stringstream und c_str() on Sun, 02 Sep 2012 14:23:08 GMT]]></title><description><![CDATA[<p>Ja, &lt;string&gt; wird bei &lt;sstream&gt; mit eingebunden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247848</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247848</guid><dc:creator><![CDATA[knuffimaus]]></dc:creator><pubDate>Sun, 02 Sep 2012 14:23:08 GMT</pubDate></item><item><title><![CDATA[Reply to stringstream und c_str() on Sun, 02 Sep 2012 14:27:02 GMT]]></title><description><![CDATA[<p>[cpp]what() <strong>const</strong>[/cpp]</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247849</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247849</guid><dc:creator><![CDATA[const-erkenner]]></dc:creator><pubDate>Sun, 02 Sep 2012 14:27:02 GMT</pubDate></item><item><title><![CDATA[Reply to stringstream und c_str() on Sun, 02 Sep 2012 15:16:35 GMT]]></title><description><![CDATA[<p>knuffimaus schrieb:</p>
<blockquote>
<p>Ja, &lt;string&gt; wird bei &lt;sstream&gt; mit eingebunden.</p>
</blockquote>
<p>Drauf würde ich mich nicht verlassen. Ev. wird std::string auch nur Vorwärtsdeklariert. Ausserdem, was passiert, wenn Du beschliesst nicht mehr std::ostringstream sondern boost::format zur Formatierung deines Strings zu benutzen (dann löschst Du #include &lt;sstream&gt; und fügst #include &lt;boost/format.hpp&gt; hinzu...)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247865</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247865</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Sun, 02 Sep 2012 15:16:35 GMT</pubDate></item><item><title><![CDATA[Reply to stringstream und c_str() on Sun, 02 Sep 2012 15:36:43 GMT]]></title><description><![CDATA[<p>Warum setzt du den Stream in <code>what()</code> zusammen? <code>what()</code> ist nur ein Getter für die Fehlermeldung, deswegen ist die Methode auch <code>const</code> -qualifiziert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247875</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247875</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 02 Sep 2012 15:36:43 GMT</pubDate></item><item><title><![CDATA[Reply to stringstream und c_str() on Sun, 02 Sep 2012 15:49:17 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Warum setzt du den Stream in <code>what()</code> zusammen? <code>what()</code> ist nur ein Getter für die Fehlermeldung, deswegen ist die Methode auch <code>const</code> -qualifiziert.</p>
</blockquote>
<p>Das wäre im Prinzip gar keine schlechte Idee. Die Formatierung benötigt Zeit und wenn ich an einer eventuell performancekritischen stelle eine exception auffangen will, der Text mich aber nicht interessiert, dann wird die Formatierung erst gar nicht ausgeführt.</p>
<p>Es ist natürlich nicht ganz trivial, es richtig zu implementieren, aber machbar. Man könnte beispielsweise ein mutable std::string als Member vor sehen, in den man die Fehlermeldung formatiert, wenn what aufgerufen wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247881</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247881</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Sun, 02 Sep 2012 15:49:17 GMT</pubDate></item><item><title><![CDATA[Reply to stringstream und c_str() on Sun, 02 Sep 2012 15:58:28 GMT]]></title><description><![CDATA[<p>tntnet schrieb:</p>
<blockquote>
<p>Die Formatierung benötigt Zeit und wenn ich an einer eventuell performancekritischen stelle eine exception auffangen will, der Text mich aber nicht interessiert, dann wird die Formatierung erst gar nicht ausgeführt.</p>
</blockquote>
<p>Da fängt man aber keine Ausnahmen auf, weil das eben Ausnahmen sind. Die sind auch ohne Nachricht langsam.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247883</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247883</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Sun, 02 Sep 2012 15:58:28 GMT</pubDate></item><item><title><![CDATA[Reply to stringstream und c_str() on Sun, 02 Sep 2012 16:16:10 GMT]]></title><description><![CDATA[<p>TyRoXx schrieb:</p>
<blockquote>
<p>Die sind auch ohne Nachricht langsam.</p>
</blockquote>
<p>Ist das im Standard so spezifiziert? Ich würde das nicht so verallgemeinern. Es gibt auch Situationen, da möchte ich schnell auf eine Ausnahme reagieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247887</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247887</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Sun, 02 Sep 2012 16:16:10 GMT</pubDate></item><item><title><![CDATA[Reply to stringstream und c_str() on Sun, 02 Sep 2012 18:12:31 GMT]]></title><description><![CDATA[<p>tntnet schrieb:</p>
<blockquote>
<p>TyRoXx schrieb:</p>
<blockquote>
<p>Die sind auch ohne Nachricht langsam.</p>
</blockquote>
<p>Ist das im Standard so spezifiziert? Ich würde das nicht so verallgemeinern. Es gibt auch Situationen, da möchte ich schnell auf eine Ausnahme reagieren.</p>
</blockquote>
<p>Ist doch egal was vom Standard spezifiziert ist.<br />
Klar steht da nicht drin &quot;Exceptions haben langsam zu sein&quot;.<br />
Es gibt halt Systeme auf denen sind sie langsam, und damit sollte man sich abfinden. Und seine Programme darauf auslegen.<br />
Weil sie sonst halt nicht gut funktionieren werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247913</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247913</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 02 Sep 2012 18:12:31 GMT</pubDate></item></channel></rss>