Dies ist ein Auszug aus Stroustups Buch, 3. Auflage, auf Seite 362:
Im Prinzip wird eine Exception kopiert, wenn sie ausgelöst wird. Der Handler erhält also eine Kopie des ursprüngliche Ausnahme Tatsächlich kann eine Ausnahme mehrmals kopiert werden, bevor sie abgefangen wird. Folglich, Wir können keine Ausnahme werfen, die nicht kopiert werden kann. Die Implementierung kann gelten a Vielzahl von Strategien zum Speichern und Übertragen von Ausnahmen. Es ist jedoch garantiert, dass es gibt genügend Speicher, um Neuem zu erlauben, den Standard-Outofmemory zu werfen Ausnahme, bad_alloc.
Normalerweise, wenn Sie throw
eine Ausnahme haben, ist es ein zweistufiger Prozess:
Der Standard garantiert, dass Ihnen im Falle, dass Ihnen kein Speicherplatz mehr zur Verfügung steht, immer noch genug Speicherplatz zur Verfügung steht, um throw
a std::bad_alloc
exception.
Es gibt verschiedene Strategien:
Im Allgemeinen stellt die Laufzeit etwas Speicherplatz zur Verfügung, um Ausnahmen zu kopieren, ohne tatsächlich eine Speicherzuweisung durchzuführen. Es ist also ziemlich üblich, diesen Platz wiederzuverwenden.
Wenn kein Speicher mehr verfügbar ist und ein Aufruf von new () einen std :: bad_alloc auslöst, wird etwas Speicher reserviert und die richtige Anzahl von Kopien des std :: bad_alloc-Objekts erstellt einen weiteren std :: bad_alloc als Ergebnis des Auslösens der Ausnahme werfen.
bedeutet, wenn Sie new eingeben und nicht genügend Speicher vorhanden ist, um etwas zuzuordnen (dh Sie haben keinen Speicher mehr), wird es im System immer noch einen vorreservierten Puffer geben, der groß genug ist, um einen 'bad_alloc' zu erstellen 'Ausnahme und wirf es.
Wenn Sie keinen Speicher mehr haben, wie würden Sie davon ausgehen, dass das System alles kopiert? Deshalb ist dies in diesem Abschnitt wichtig - es besagt, dass alle Ausnahmen kopiert werden müssen, aber in dem Fall, dass es keinen Speicher gibt, können Sie immer noch einen dieser speziellen herausholen, um dem Rest Ihrer App mitzuteilen, was passiert ist / p>
Das bedeutet einfach, dass new
die Ausnahme bad_alloc
immer korrekt ausgibt, wenn das angeforderte Objekt nicht ordnungsgemäß erstellt werden kann, obwohl das zuvor erwähnte Material darauf hinweist, dass dies möglicherweise nicht möglich ist. Aber jede Implementierung muss sicherstellen, dass sie auf jede Art funktioniert.