Frage

Zwei Fragen 1) Was passiert, wenn ein Objekt / eine Variable zum Abfangen geworfen wird? Sagen Sie zum Beispiel

int foo() {
   FILE *fp = ....;
   int dummy = 10;
   int *dummy_ptr = new int[10];
   throw 1;
}

int main() {
 try {
   foo();
 } catch (int &i) { 
   std::cout<<"ERROR, the value is "<<i<<std::endl;
 }
}

Was passiert in dieser Situation hier? Eine neue Variable erstellt und dann übergeben ???

Was ist, wenn ich einen Zeiger oder eine Variable ohne Referenz verwende?

wie catch (int * i) // oder catch (int i)

Wurden auch alle im Bereich deklarierten oder initiierten Variablen / Ressourcen freigegeben / geschlossen?

2) Auch im Falle eines erneuten Werfens Wenn ich vorhabe, mit einer Referenz erneut zu werfen, erhält der zweite Fang eine neue Variable. Wenn ich mit ohne Referenz (d. h.) nach Wert erneut werfe, sind die im Zwischenwurf vorgenommenen Änderungen nicht betroffen ....

int goo() {
    throw 2;
}

int foo() {
   try{
      goo();
   } catch(int &i) { // (or) catch(int i) // i is not changing in the next line.
      i = 2;
      throw;
   }
}

int main() {
 try {
   foo();
 } catch (int &i) { 
   std::cout<<"ERROR, the value is "<<i<<std::endl;
 }
}

AUSGABE: catch (int & i) // druckt 2 catch (int i) // druckt 1

Meines Erachtens

Ich denke, solange es sich um eine Referenz handelt, wird der Wert beeinflusst. wenn es im Zwischenschritt 'Wert übergeben' ist. es wirft immer noch das ursprüngliche Objekt auf den zweiten Fang.

(d. h.) der Kontrollfluss für die Variable ist wirklich nicht der Zwischenfang .....

War es hilfreich?

Lösung

Ja, wenn eine Ausnahme ausgelöst wird, sind alle automatischen Variablen zerstört, im Rahmen des Wurfs und aller umschließenden Bereiche bis Der Handler ist erreicht.

Ein Hinweis dazu, Ihr Speicher im dummy_ptr* wird nicht freigegeben, und Ihr FILE-Zeiger fp* wird nicht geschlossen.

Andere Tipps

Was passiert in dieser Situation hier? Eine neue Variable erstellt und dann übergeben?

Ja; Wenn Sie ein Objekt werfen, wird es irgendwo erstellt und dann zerstört, sobald die Ausnahme behandelt wurde (dh nachdem Sie den catch-Block ohne erneutes Werfen verlassen haben).

Was ist, wenn ich einen Zeiger oder eine Variable ohne Referenz verwende? Auch im Falle eines erneuten Werfens ...

Wenn Sie nach Wert abfangen, erhalten Sie eine Kopie dieses Objekts. Wenn Sie die Ausnahme erneut auslösen, erhält der nächste Handler eine neue Kopie des Originals und sieht keine Änderungen, die Sie möglicherweise vorgenommen haben. Wenn Sie nach Referenz abfangen, erhalten Sie eine Referenz auf das ausgelöste Objekt. Wenn Sie erneut werfen, sieht der nächste Handler alle von Ihnen vorgenommenen Änderungen. Sie können das Objekt nicht mit einem Zeiger abfangen - Sie werden einen Zeiger nur abfangen, wenn ein Zeiger geworfen wurde.

Wurden auch alle im Bereich deklarierten oder initiierten Variablen geschlossen?

Wenn eine Ausnahme ausgelöst wird, werden alle automatischen Variablen im Rahmen des throw und aller einschließenden Bereiche zerstört, bis der Handler erreicht ist. Dynamisch zugewiesene Variablen (wie Ihr new int[10]) werden nicht gelöscht, und willkürliche Bereinigungsfunktionen wie fclose werden für FILE*-Variablen sicherlich nicht aufgerufen, es sei denn, sie werden von einem bereichsbereichsbasierten Objekt wie einem smart verwaltet Zeiger.

Ich glaube nicht, dass Sie es eine Variable nennen können.es hat keinen Namen.Aber a Ein neues Objekt vom Typ int wird an einer nicht festgelegten Stelle erstellt durch die Umsetzung.Wenn Sie als Referenz fangen, ist die Referenz an dieses versteckte Objekt gebunden.Und wenn Sie vom Ende des Fangs fallen blockieren, oder verlassen Sie den Fangblock auf andere Weise als durch erneutes Werfen des Mit der gleichen Ausnahme wird das Objekt "freigegeben".

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top