<?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 Speicherfehler behandeln]]></title><description><![CDATA[<p>Hi,</p>
<p>wenn man per new Speicher anfordert und dieses nicht gelingt wird ja eine bad_alloc Exception geworfen. Nun ist meine Frage: Intern werden ja auch dauernd<br />
neue Objecte erstellt und denke mal auch mit new erstellt.<br />
z.B.</p>
<pre><code class="language-cpp">std::string foo( void )
{
    return( &quot;1234&quot; );
}
</code></pre>
<p>Da müssen ja mindestens 5 Bytes intern angefordert werden.<br />
Was passiert wenn dies nicht möglich ist?<br />
Wird dann auch eine bad alloc Exception geworfen?</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/208615/wie-speicherfehler-behandeln</link><generator>RSS for Node</generator><lastBuildDate>Mon, 12 Oct 2026 00:10:27 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/208615.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 20 Mar 2008 12:00:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wie Speicherfehler behandeln on Thu, 20 Mar 2008 12:00:53 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>wenn man per new Speicher anfordert und dieses nicht gelingt wird ja eine bad_alloc Exception geworfen. Nun ist meine Frage: Intern werden ja auch dauernd<br />
neue Objecte erstellt und denke mal auch mit new erstellt.<br />
z.B.</p>
<pre><code class="language-cpp">std::string foo( void )
{
    return( &quot;1234&quot; );
}
</code></pre>
<p>Da müssen ja mindestens 5 Bytes intern angefordert werden.<br />
Was passiert wenn dies nicht möglich ist?<br />
Wird dann auch eine bad alloc Exception geworfen?</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1477746</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1477746</guid><dc:creator><![CDATA[plongor]]></dc:creator><pubDate>Thu, 20 Mar 2008 12:00:53 GMT</pubDate></item><item><title><![CDATA[Reply to Wie Speicherfehler behandeln on Thu, 20 Mar 2008 12:19:08 GMT]]></title><description><![CDATA[<p>Globaler exception handler installieren und filter dazu schreiben.<br />
<a href="http://msdn2.microsoft.com/en-us/library/5z4bw5h5.aspx" rel="nofollow">http://msdn2.microsoft.com/en-us/library/5z4bw5h5.aspx</a></p>
<p>Übrigens wird in deinem Bsp. (bei nur 5 character) bei den meisten Impl. von std::string kein Speicher auf dem Heap (mit new) alloziert.</p>
<p>Gruss Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1477766</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1477766</guid><dc:creator><![CDATA[simon.gysi]]></dc:creator><pubDate>Thu, 20 Mar 2008 12:19:08 GMT</pubDate></item><item><title><![CDATA[Reply to Wie Speicherfehler behandeln on Thu, 20 Mar 2008 12:30:17 GMT]]></title><description><![CDATA[<p>simon.gysi schrieb:</p>
<blockquote>
<p>Globaler exception handler installieren und filter dazu schreiben.<br />
<a href="http://msdn2.microsoft.com/en-us/library/5z4bw5h5.aspx" rel="nofollow">http://msdn2.microsoft.com/en-us/library/5z4bw5h5.aspx</a></p>
</blockquote>
<p>Sieht irgendwie nicht sehr plattformunabhängig aus <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><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/26836">@Topic</a>:<br />
Alles, was new oder new[] benutzt, wirft bad_alloc. Dynamische Datenstrukturen in der Standardbibliothek benutzen Allokatoren, und der (einzige) Allokator der Standardbibliothek nutzt seinerseits new oder new[]. Damit wirft erstmal alles, was aus dem Standard kommt und Speicher anfordert, im Fehlerfall bad_alloc.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1477776</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1477776</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Thu, 20 Mar 2008 12:30:17 GMT</pubDate></item><item><title><![CDATA[Reply to Wie Speicherfehler behandeln on Thu, 20 Mar 2008 14:04:29 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>der (einzige) Allokator der Standardbibliothek nutzt seinerseits new oder new[]</p>
</blockquote>
<p>nicht ganz. Der Defaultallokator benutzt ::operator new(size_t) bzw. ::operator delete(void*) - also die globale nicht-array nicht-placement Allokations-/Deallokationsfunktionen. Deshalb wird für diesen Allokator auch nicht noch einmal extra das Verhalten im Fehlerfall festgelegt, dieses ist bereits durch die Spezifikation jener Funktionen bestimmt (==new ruft im Fehlerfall den new_handler auf bzw. wirft bad_alloc).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1477833</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1477833</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 20 Mar 2008 14:04:29 GMT</pubDate></item><item><title><![CDATA[Reply to Wie Speicherfehler behandeln on Thu, 20 Mar 2008 15:26:44 GMT]]></title><description><![CDATA[<p>In deinem konkreten Beispiel wird gar kein Speicher dynamisch alloziert. Der String landet im Binary einfach im Textsegment. In Java sieht das natürlich anders aus <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/1477873</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1477873</guid><dc:creator><![CDATA[Hindman]]></dc:creator><pubDate>Thu, 20 Mar 2008 15:26:44 GMT</pubDate></item><item><title><![CDATA[Reply to Wie Speicherfehler behandeln on Thu, 20 Mar 2008 15:34:47 GMT]]></title><description><![CDATA[<p>Hindman schrieb:</p>
<blockquote>
<p>In deinem konkreten Beispiel wird gar kein Speicher dynamisch alloziert. Der String landet im Binary einfach im Textsegment. In Java sieht das natürlich anders aus <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>Es wird ein std:string konstruiert, und dabei muss das Literal irgendwohin kopiert werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1477877</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1477877</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 20 Mar 2008 15:34:47 GMT</pubDate></item><item><title><![CDATA[Reply to Wie Speicherfehler behandeln on Thu, 20 Mar 2008 15:38:02 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Es wird ein std:string konstruiert, und dabei muss das Literal irgendwohin kopiert werden.</p>
</blockquote>
<p>In manchen Implementierungen von std::string stehen ein paar Bytes zur Verfügung um dort kurze Strings einfach ablegen zu müssen. Kann man aber natürlich nicht von ausgehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1477881</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1477881</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Thu, 20 Mar 2008 15:38:02 GMT</pubDate></item><item><title><![CDATA[Reply to Wie Speicherfehler behandeln on Thu, 20 Mar 2008 15:41:52 GMT]]></title><description><![CDATA[<p>Ein vernüftiges Vorgehen ist also mit set_new_handler einen new- handler installieren und dort die speicherknappheit gehandeln (wie auch immer).</p>
<p>Korrekt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1477886</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1477886</guid><dc:creator><![CDATA[simon.gysi]]></dc:creator><pubDate>Thu, 20 Mar 2008 15:41:52 GMT</pubDate></item><item><title><![CDATA[Reply to Wie Speicherfehler behandeln on Thu, 20 Mar 2008 21:21:30 GMT]]></title><description><![CDATA[<p>Vielen Dank,</p>
<p>ich werde es jetzt folgendermaßen machen.<br />
Für jede Klasse den new Operator überladen und die set_new_handler Funktion benutzen.</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1478076</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1478076</guid><dc:creator><![CDATA[plongor]]></dc:creator><pubDate>Thu, 20 Mar 2008 21:21:30 GMT</pubDate></item><item><title><![CDATA[Reply to Wie Speicherfehler behandeln on Thu, 20 Mar 2008 21:42:44 GMT]]></title><description><![CDATA[<p>Eine Frage ist mir noch eingefallen.<br />
Gibt es eine möglichkeit den operator new für die standart Typen wie int oder float zu überladen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1478084</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1478084</guid><dc:creator><![CDATA[plongor]]></dc:creator><pubDate>Thu, 20 Mar 2008 21:42:44 GMT</pubDate></item><item><title><![CDATA[Reply to Wie Speicherfehler behandeln on Fri, 21 Mar 2008 08:42:59 GMT]]></title><description><![CDATA[<p>Was spricht gegen ein catch bad_alloc in main, wenn man davon absieht, dass bad_allocs in der Konstruktion globaler Objekte nicht gefangen würden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1478178</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1478178</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Fri, 21 Mar 2008 08:42:59 GMT</pubDate></item><item><title><![CDATA[Reply to Wie Speicherfehler behandeln on Fri, 21 Mar 2008 09:18:26 GMT]]></title><description><![CDATA[<p>plongor schrieb:</p>
<blockquote>
<p>Eine Frage ist mir noch eingefallen.<br />
Gibt es eine möglichkeit den operator new für die stan**** Typen wie int oder float zu überladen?</p>
</blockquote>
<p>Du kannst den globalen Operator new überladen, also für ALLE Typen. Für einzelne ausgewählte build ins soweit ich weiß allerdings nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1478188</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1478188</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 21 Mar 2008 09:18:26 GMT</pubDate></item><item><title><![CDATA[Reply to Wie Speicherfehler behandeln on Fri, 21 Mar 2008 13:30:52 GMT]]></title><description><![CDATA[<p>So, jetzt funktioniert alles wie ich es wollte.<br />
Eine allerletzte Frage habe ich aber noch.<br />
Woher weiß ich wieviel Speicher mein Programm auch ohne new Anfragen benutzt?<br />
Das muss der Compiler bzw. das Betriebsystem ja vorher wissen.<br />
wenn ich zum Beispiel</p>
<pre><code class="language-cpp">void foo( void )
{
    char test[ 100 ];
}

int main( int argc, char** argv )
{
    foo();
}
</code></pre>
<p>mache, muss das OS ja wissen, ob genügend Speicher vorhanden ist um die Funktion foo auszuführen. Wo werden die 100 Bytes dann überhaupt hingespeichert?<br />
Müssten die nicht eg intern dann auch wieder mit new angefordert werden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1478314</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1478314</guid><dc:creator><![CDATA[plongor]]></dc:creator><pubDate>Fri, 21 Mar 2008 13:30:52 GMT</pubDate></item><item><title><![CDATA[Reply to Wie Speicherfehler behandeln on Sat, 22 Mar 2008 11:29:22 GMT]]></title><description><![CDATA[<blockquote>
<p>Wo werden die 100 Bytes dann überhaupt hingespeichert?</p>
</blockquote>
<p>Auf dem Stack.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1478653</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1478653</guid><dc:creator><![CDATA[simon.gysi]]></dc:creator><pubDate>Sat, 22 Mar 2008 11:29:22 GMT</pubDate></item><item><title><![CDATA[Reply to Wie Speicherfehler behandeln on Sat, 22 Mar 2008 11:32:16 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>Was spricht gegen ein catch bad_alloc in main, wenn man davon absieht, dass bad_allocs in der Konstruktion globaler Objekte nicht gefangen würden?</p>
</blockquote>
<p>Das müsste dann bei jedem Thread gemacht werden.<br />
Mit dem new handler wäre das &quot;global&quot; geregelt.</p>
<p>Mein Verständnis für die std::bad_alloc oder den new handler sind so, dass wenns schief geht, ist es im allgemeinen nicht mehr so super und ich dann noch z.B. ein Log Eintrag erzeugen kann, bevor das Programm terminiert wird.</p>
<p>Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1478656</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1478656</guid><dc:creator><![CDATA[simon.gysi]]></dc:creator><pubDate>Sat, 22 Mar 2008 11:32:16 GMT</pubDate></item></channel></rss>