Was hat der letzte Satz in Fettdruck damit zu tun, eine ausgelöste Ausnahme zu kopieren?

8

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.

    
Belloc 20.01.2012, 15:13
quelle

4 Antworten

6

Normalerweise, wenn Sie throw eine Ausnahme haben, ist es ein zweistufiger Prozess:

  1. Die Ausnahme wird lokal auf dem Stack erstellt
  2. Die Ausnahme wird ausgelöst, bei der eine Kopie "irgendwo" gespeichert und das temporäre Objekt, das sich auf dem Stapel befand, gelöscht wird.

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.

zu haben

Es gibt verschiedene Strategien:

  • habe einfach die Ausnahme statisch zugewiesen und "falsch" geworfen (nur um einen Verweis auf den statischen)
  • reserviere etwas Platz (gerade genug) für die Ausnahme
  • ...

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.

    
Matthieu M. 20.01.2012, 15:19
quelle
9

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.

    
alanxz 20.01.2012 15:18
quelle
2

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>     

gbjbaanb 20.01.2012 15:20
quelle
1

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.

    
leftaroundabout 20.01.2012 15:23
quelle

Tags und Links