<?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[std::bad_alloc ignorieren oder immer berücksichtigen?]]></title><description><![CDATA[<p>Ist std::bad_alloc überhaupt noch zeitgemäss?</p>
<p>Heute Betriebssysteme haben mehrere Programme am Laufen, der aktuell freie Speicher ist also völlig unabhängig vom eigenen Programm. Dann gibt es noch Auslagerungsspeicher, Overcommits, etc. Ob und wann std::bad_alloc geschmissen wird ist absolut zufällig.</p>
<p>Es gibt auch keine gute Antwort auf ein bad_alloc. Ich darf kein File öffnen, ich darf nichts in ein File schreiben, ich darf nichtmal Strings zusammensetzen oder einen Dialog öffnen, alles könnte wieder std::bad_alloc werfen.</p>
<p>In meiner Erfahrung tritt der Fall so gut wie nie auf und es ist deshalb vergebene Mühe, sich darauf einzustellen. (Mal von riesigen Allokationen abgesehen, wo erwartet wird, dass die mal fehlschlagen können.)</p>
<p>Ich sehe immer wieder einzelne Leute, die versuchen std::bad_alloc zu berücksichtigen: <a href="http://www.c-plusplus.net/forum/320976" rel="nofollow">http://www.c-plusplus.net/forum/320976</a><br />
Und Richtlinien, dass Exceptions keine Strings halten dürfen, wegen bad_alloc.</p>
<p>Ich kann gut mit Programmen leben, die abstürzen wenn kein Speicher mehr verfügbar ist. Schliesslich schliesse ich als User auch Programme, wenn der Speicher ausgeht. Vielleicht ein catch(bad_alloc&amp;) in main, aber das wars.</p>
<p>Wie seht ihr das?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/320978/std-bad_alloc-ignorieren-oder-immer-berücksichtigen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 22 Jul 2026 14:06:53 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/320978.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 19 Oct 2013 16:01:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::bad_alloc ignorieren oder immer berücksichtigen? on Sat, 19 Oct 2013 16:01:06 GMT]]></title><description><![CDATA[<p>Ist std::bad_alloc überhaupt noch zeitgemäss?</p>
<p>Heute Betriebssysteme haben mehrere Programme am Laufen, der aktuell freie Speicher ist also völlig unabhängig vom eigenen Programm. Dann gibt es noch Auslagerungsspeicher, Overcommits, etc. Ob und wann std::bad_alloc geschmissen wird ist absolut zufällig.</p>
<p>Es gibt auch keine gute Antwort auf ein bad_alloc. Ich darf kein File öffnen, ich darf nichts in ein File schreiben, ich darf nichtmal Strings zusammensetzen oder einen Dialog öffnen, alles könnte wieder std::bad_alloc werfen.</p>
<p>In meiner Erfahrung tritt der Fall so gut wie nie auf und es ist deshalb vergebene Mühe, sich darauf einzustellen. (Mal von riesigen Allokationen abgesehen, wo erwartet wird, dass die mal fehlschlagen können.)</p>
<p>Ich sehe immer wieder einzelne Leute, die versuchen std::bad_alloc zu berücksichtigen: <a href="http://www.c-plusplus.net/forum/320976" rel="nofollow">http://www.c-plusplus.net/forum/320976</a><br />
Und Richtlinien, dass Exceptions keine Strings halten dürfen, wegen bad_alloc.</p>
<p>Ich kann gut mit Programmen leben, die abstürzen wenn kein Speicher mehr verfügbar ist. Schliesslich schliesse ich als User auch Programme, wenn der Speicher ausgeht. Vielleicht ein catch(bad_alloc&amp;) in main, aber das wars.</p>
<p>Wie seht ihr das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2361403</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2361403</guid><dc:creator><![CDATA[bad_allprog]]></dc:creator><pubDate>Sat, 19 Oct 2013 16:01:06 GMT</pubDate></item><item><title><![CDATA[Reply to std::bad_alloc ignorieren oder immer berücksichtigen? on Sat, 19 Oct 2013 16:24:23 GMT]]></title><description><![CDATA[<p>Offenbar geht es dir nur um Pc Betriebssysteme. Bei anderen Geräten kann die Situation deutlich anders sein.</p>
<p>bad_allprog schrieb:</p>
<blockquote>
<p>Heute Betriebssysteme haben mehrere Programme am Laufen, der aktuell freie Speicher ist also völlig unabhängig vom eigenen Programm.</p>
</blockquote>
<p>Das stimmt so nicht. Bei Übliche Betriebssysteme kannst du dir so viel Speicher allokieren wie der virtuelle Adressraum groß ist. Dieser steht jedem Program exklusiv zur verfügung, lediglich das Betriebssystem belegt davon etwas für sich selber.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2361410</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2361410</guid><dc:creator><![CDATA[TNA]]></dc:creator><pubDate>Sat, 19 Oct 2013 16:24:23 GMT</pubDate></item><item><title><![CDATA[Reply to std::bad_alloc ignorieren oder immer berücksichtigen? on Sat, 19 Oct 2013 16:38:52 GMT]]></title><description><![CDATA[<p>In durchschnittlichen Desktop-Apps? Sehe ich genau so. Aber auf einem Server oder einem Datenbankprozess oder Ähnlichem will man lieber nicht gegen die Wand fahren, nur weil eine Allokation fehl schlägt. Da muss man sich leider jeweils im Einzelfall überlegen, was am sinnvollsten ist. (Alloc fangen / eigener Allocator / gleich nothrow + unique_ptr / ...)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2361415</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2361415</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Sat, 19 Oct 2013 16:38:52 GMT</pubDate></item><item><title><![CDATA[Reply to std::bad_alloc ignorieren oder immer berücksichtigen? on Sat, 19 Oct 2013 16:43:11 GMT]]></title><description><![CDATA[<p>Was soll man denn bitte machen, wenn man ein std::bad_alloc erhält?<br />
Die einzige Möglichkeit, die ich sehe, ist Bufferspeicher freigeben, Fehlermeldung ausgeben, exit()/abort().<br />
Genau diese Aktion macht mein new handler; bad alloc wird also gar nicht mehr geworfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2361419</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2361419</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sat, 19 Oct 2013 16:43:11 GMT</pubDate></item><item><title><![CDATA[Reply to std::bad_alloc ignorieren oder immer berücksichtigen? on Sat, 19 Oct 2013 16:46:03 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>In durchschnittlichen Desktop-Apps? Sehe ich genau so. Aber auf einem Server oder einem Datenbankprozess oder Ähnlichem will man lieber nicht gegen die Wand fahren, nur weil eine Allokation fehl schlägt.</p>
</blockquote>
<p>Stimmt zwar, aber das verschiebt man auf OS-Level und gibt der Anwendung das Gefühl, unendlich viel Speicher zu haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2361422</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2361422</guid><dc:creator><![CDATA[bad_allprog]]></dc:creator><pubDate>Sat, 19 Oct 2013 16:46:03 GMT</pubDate></item><item><title><![CDATA[Reply to std::bad_alloc ignorieren oder immer berücksichtigen? on Sat, 19 Oct 2013 16:47:35 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>Was soll man denn bitte machen, wenn man ein std::bad_alloc erhält?<br />
Die einzige Möglichkeit, die ich sehe, ist Bufferspeicher freigeben, Fehlermeldung ausgeben, exit()/abort().<br />
Genau diese Aktion macht mein new handler; bad alloc wird also gar nicht mehr geworfen.</p>
</blockquote>
<p>Aufräumen, Temp-Dateien löschen, sich von Netzwerkpartnern höflich verabschieden, Datenbankverbindung kappen, ...</p>
<p>Also bad_alloc nicht fangen und regieren, sondern ruhig bis zur main() hochrauschen lassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2361425</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2361425</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 19 Oct 2013 16:47:35 GMT</pubDate></item><item><title><![CDATA[Reply to std::bad_alloc ignorieren oder immer berücksichtigen? on Sat, 19 Oct 2013 16:59:32 GMT]]></title><description><![CDATA[<p>bad_allprog schrieb:</p>
<blockquote>
<p>Stimmt zwar, aber das verschiebt man auf OS-Level und gibt der Anwendung das Gefühl, unendlich viel Speicher zu haben.</p>
</blockquote>
<p>Und wenn die Platte auch voll ist, was dann? Das ist jetzt auch nicht undenkbar. Zudem dürfte eine Festplatte in einige Fällen auch so langsam sein, dass ein geordneter Rückzug am Ende wünschenswerter ist. Ich fürchte, es wird einfach immer ein paar Programme geben die dieses Problem nicht einfach ignorieren können.</p>
<p>Nathan schrieb:</p>
<blockquote>
<p>Was soll man denn bitte machen, wenn man ein std::bad_alloc erhält?</p>
</blockquote>
<p>Paradebeispiel wäre z.B. das Leeren von Caches. Oder das Warten auf i/o; wenn man z.B. wartet bis das (asynchrone) Schreiben in eine Datei abgeschlossen ist, wird danach der Speicher in dem die zu schreibenden Daten standen frei gegeben. Je nach Anwendung gibt es durchaus einige Möglichkeiten, wobei das Programm danach sogar normal weiter laufen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2361429</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2361429</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Sat, 19 Oct 2013 16:59:32 GMT</pubDate></item><item><title><![CDATA[Reply to std::bad_alloc ignorieren oder immer berücksichtigen? on Sat, 19 Oct 2013 17:05:17 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>bad_allprog schrieb:</p>
<blockquote>
<p>Stimmt zwar, aber das verschiebt man auf OS-Level und gibt der Anwendung das Gefühl, unendlich viel Speicher zu haben.</p>
</blockquote>
<p>Und wenn die Platte auch voll ist, was dann?</p>
</blockquote>
<p>Soweit darf es gar nicht erst kommen. Das Programm checkt natürlich immer mal wieder den Speicherverbrauch und unternimmt entsprechend Aktionen, den Cache verkleinern, die Anzahl Worker reduzieren, etc (z.B. alle 1sec oder im eigenen malloc). Und wenn alles nicht hilft, dann wird ein geordneter Neustart unternommen.</p>
<p>Sind aber alles Sachen, die du nicht machen kannst, wenn du etwas allokierst. Das muss irgendwo zentral geschehen und da ist bad_alloc hinderlich.</p>
<p>Also entweder bad_alloc bis auf main durchrauschen lassen oder ein kluges Memory-System ohne bad_alloc.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2361430</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2361430</guid><dc:creator><![CDATA[bad_allprog]]></dc:creator><pubDate>Sat, 19 Oct 2013 17:05:17 GMT</pubDate></item><item><title><![CDATA[Reply to std::bad_alloc ignorieren oder immer berücksichtigen? on Sat, 19 Oct 2013 17:20:37 GMT]]></title><description><![CDATA[<p>bad_allprog schrieb:</p>
<blockquote>
<p>Soweit darf es gar nicht erst kommen. Das Programm checkt natürlich immer mal wieder den Speicherverbrauch und unternimmt entsprechend Aktionen, den Cache verkleinern, die Anzahl Worker reduzieren, etc (z.B. alle 1sec oder im eigenen malloc).</p>
<p>Sind aber alles Sachen, die du nicht machen kannst, wenn du etwas allokierst. Das muss irgendwo zentral geschehen und da ist bad_alloc hinderlich.</p>
</blockquote>
<p>Momentchen! Dein new kann durchaus schlau sein und die Sachen alle machen. Und Dein new_handler kann durchaus Caches leeren, Worker reduzieren und ein Sekundchen warten, damit Threads auslaufen, Threads abschießen, und alles versuchen. Wenns nicht klappt, noch ein Fitzelchen Speicher zu bekommen, dann passiert halt bad_alloc. Das passt doch herrlich zusammen.</p>
<blockquote>
<p>Also entweder bad_alloc bis auf main durchrauschen lassen oder ein kluges Memory-System ohne bad_alloc.</p>
</blockquote>
<p>Freiwilliger Verzicht auf RAII passt mir nicht in den Kram.</p>
<blockquote>
<p>Und wenn alles nicht hilft, dann wird ein geordneter Neustart unternommen.</p>
</blockquote>
<p>Jo, typischerweise in der Endlosschleife in der main(), oder? Die main() muss alles fangen, so oder so.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2361433</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2361433</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 19 Oct 2013 17:20:37 GMT</pubDate></item><item><title><![CDATA[Reply to std::bad_alloc ignorieren oder immer berücksichtigen? on Sat, 19 Oct 2013 18:32:50 GMT]]></title><description><![CDATA[<p>der einzige Punkt wo ich bad_alloc krige ist, wenn ich Speicher anforder der größer ist als die verbliebenen physischen Resourcen+alle vom Betriebssystem überwachten Buffer. Wenn das schief geht ist s normalerweise wurscht, kleine Allokationen werden dort meistens noch gehen.</p>
<p>Bei kleinen Allokationen würde ich niemals bad_alloc erwarten - an dem punkt swapt sich das System mit hoher Wahrscheinlichkeit eh gerade tot und geordnetes Abbauen ist aufgrund des überforderten Schdulers nicht mehr möglich.</p>
<p>Daher erwarte ich niemals bad_alloc</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2361445</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2361445</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Sat, 19 Oct 2013 18:32:50 GMT</pubDate></item><item><title><![CDATA[Reply to std::bad_alloc ignorieren oder immer berücksichtigen? on Sat, 19 Oct 2013 18:40:20 GMT]]></title><description><![CDATA[<p>Nein physischer Speicher ist nicht der Punkt, wie ich vor einigen Wochen feststellen musste (die älteren mögen sich vllt erinnern).</p>
<p>Windows schiebt bei 2GB pro process einen Riegel vor und dann kommt schon bad_alloc...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2361446</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2361446</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Sat, 19 Oct 2013 18:40:20 GMT</pubDate></item><item><title><![CDATA[Reply to std::bad_alloc ignorieren oder immer berücksichtigen? on Sat, 19 Oct 2013 18:51:39 GMT]]></title><description><![CDATA[<blockquote>
<p>Windows schiebt bei 2GB pro process einen Riegel vor und dann kommt schon bad_alloc...</p>
</blockquote>
<p>Nur bei 32-Bit-Anwendungen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2361450</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2361450</guid><dc:creator><![CDATA[Mr X]]></dc:creator><pubDate>Sat, 19 Oct 2013 18:51:39 GMT</pubDate></item><item><title><![CDATA[Reply to std::bad_alloc ignorieren oder immer berücksichtigen? on Sun, 20 Oct 2013 04:07:54 GMT]]></title><description><![CDATA[<p>Auf 32 Bit Systemen mag es Sinn machen sich den Kopf darüber zu zerbrechen. Oder auf nicht-Desktop Systemen. Dummerweise ist es alles andere als einfach, und die meisten Leute die versuchen den Fall zu behandeln machen es falsch.</p>
<p>Auf 64 Bit Systemen sehe ich kein echtes Problem wenn man den Fall ignoriert. Wenn da ein <code>bad_alloc</code> fliegt ist das typischerweise zu einem Zeitpunkt wo man sowieso schon lange nicht mehr mit dem System arbeiten mag. Ausgenommen man deaktiviert das Pagefile natürlich, dann läuft alles noch halbwegs gut bis zu dem Zeitpunkt wo der Speicher alle ist.</p>
<p>Und wenn es dazu kommt, dann bei 64 Bit nicht weil der Adressraum alle ist (wie bei 32 Bit), sondern weil das OS wirklich keinen Speicher mehr besorgen kann.<br />
Wodurch sich die Frage ergibt ob man dann überhaupt nen <code>bad_alloc</code> bekommt, oder ob das OS nicht gleich den Prozess killt. Gibt nämlich Fälle wo das OS gleich den Prozess abschiessen wird. Bzw. den entsprechenden Handler der CRT aufrufen, der dann aber auch nix machen kann als den Prozess zu terminieren.</p>
<p>Und selbst wenn man den <code>bad_alloc</code> bekommt, ist nicht sichergestellt dass das Programm weiterlaufen kann. Einen solchen Fall hab ich eh bereits <a href="http://www.c-plusplus.net/forum/p2361491#2361491" rel="nofollow">in einem anderen Thread</a> beschrieben.</p>
<p>EDIT: Link korrigiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2361493</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2361493</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 20 Oct 2013 04:07:54 GMT</pubDate></item></channel></rss>