Kann sich ein Objekt selbst werfen?

8

Die Beantwortung einer letzten Frage zu Ausnahmen erinnerte mich an eine alte Abfrage.

Die folgenden Kompilierungen in C ++

%Vor%

Aber es führt immer zu einem Laufzeitfehler.

  • Wird das Objekt während des Abwickelns des Stapels nicht geworfen?

  • Der Laufzeitfehler riecht wie ein Aufruf von terminate , wie wird das verursacht?

  • Wenn weird object in einem umschließenden Bereich deklariert wurde (der globale hier), könnte dies in einem inneren Bereich funktionieren? (Wohin würde der Stapel den Vorgesetzten nicht beeinflussen?)

Nikos Athanasiou 07.03.2014, 21:59
quelle

2 Antworten

12

Das Ergebnis ist ein Aufruf von std::terminate() , weil die Ausnahme niemals abgefangen wird. Ändern Sie es in die folgenden und es funktioniert gut:

%Vor%
  
  • Wird das Objekt während des Abwickelns des Stapels nicht geworfen?
  •   

Wenn eine Ausnahme ausgelöst wird, erstellt der Mechanismus zum Auslösen einer Ausnahme eine Kopie des geworfenen Wertes irgendwo in einen privaten Speicher, so dass die Lebensdauer des geworfenen Objekts keine Rolle spielt.

(Natürlich, wenn Sie einen Zeiger werfen, dann wird der Zeigerwert beibehalten, nicht das zugespitzte Objekt. In diesem Fall müssen Sie sicherstellen, dass Catch-Handler keine illegalen Dinge mit dem Pointer-Wert tun, indem Sie entweder das Objekt ruhig stellen existiert oder dass der catch-Handler den Zeiger nicht abstuft.)

  
  • Der Laufzeitfehler riecht wie ein Aufruf von terminate , wie wird das verursacht?
  •   

Wenn eine Ausnahme ausgelöst wird und es keinen entsprechenden catch-Handler gibt, gibt C ++ an, dass std::terminate() aufgerufen werden muss. Der Exception-Wurmmechanismus, der dafür verantwortlich ist, einen geeigneten catch-Handler zu finden, implementiert dies, indem er std::terminate() aufruft, wenn er keinen passenden catch-Handler findet.

  
  • Wenn weird object in einem umschließenden Bereich deklariert wurde (der globale hier), könnte dies in einem inneren Bereich funktionieren?
  •   

Ob es global ist oder nicht, spielt keine Rolle; Das Verhalten des Auslösens der Ausnahme ist (meistens) gut definiert.

(Eine Implementierung ist angegeben, wenn der Stapel abgewickelt wird, bevor std::terminate() aufgerufen wird, wenn kein catch-Handler gefunden wird. Ich glaube, dass der Stapel in den meisten Implementierungen in diesem Fall nicht abgewickelt wird.)

    
bames53 07.03.2014, 22:04
quelle
0

Denken Sie bei Ausnahmen in C ++ daran: Nach Wert umleiten, durch Verweis fangen .

"nach Wert" = Kopieren, Kopieren = Sie müssen sich nicht mehr darum kümmern, was mit dem Originalobjekt passiert.

Randnotiz: Wenn Sie throw eigene Typen verwenden, leiten Sie sie besser von std::exception ab.

    
LihO 07.03.2014 22:07
quelle

Tags und Links