Exceptions und der Stack



  • Wäre dieses Vorgehen gültig?

    void foo()
    {
      std::string s = "Fehler!";
      throw std::runtime_error(s.c_str());
    }
    
    int main()
    {
      try
      {
        foo();
      }
      catch (std::runtime_error const& e)
      {
        std::cout << e.what();
      }
    }
    

    Bei mir funktioniert es zwar, aber ich bin mir nicht ganz sicher ob man das so machen darf. Denn der std::string wird ja eigentlich zerstört nachdem die Exception geworfen wurde. Kopiert std::runtime_error den String?



  • Der Konstruktor von runtime_error hat als Argument eine const-Referenz auf einen string. Damit dürftest du dir die Frage selbst beantworten können.


  • Mod

    Ja, das wird im Exception-Objekt gespeichert. Sollte runtime_error nicht sowieso einen string als Argument nehmen? Du gehst hier irgendwie über drei Ecken, obwohl's auch direkt ginge.



  • Bashar schrieb:

    Der Konstruktor von runtime_error hat als Argument eine const-Referenz auf einen string. Damit dürftest du dir die Frage selbst beantworten können.

    Die Tatsache, dass der Parameter ein const ist, sagt etwas über interne Kopien aus?

    Wieso das? Verstehe ich nicht...



  • Bashar schrieb:

    Der Konstruktor von runtime_error hat als Argument eine const-Referenz auf einen string.

    Autsch, das beantwortet irgendwie viel. Danke euch. 🙂



  • Langsam? schrieb:

    Bashar schrieb:

    Der Konstruktor von runtime_error hat als Argument eine const-Referenz auf einen string. Damit dürftest du dir die Frage selbst beantworten können.

    Die Tatsache, dass der Parameter ein const ist, sagt etwas über interne Kopien aus?

    Wieso das? Verstehe ich nicht...

    Hier müßte es klappen, weil der konstante String ja im Speicher liegt, aber generell ist das doch keine Antwort auf die Frage, ob er kopiert, oder?



  • Langsam? schrieb:

    Bashar schrieb:

    Der Konstruktor von runtime_error hat als Argument eine const-Referenz auf einen string. Damit dürftest du dir die Frage selbst beantworten können.

    Die Tatsache, dass der Parameter ein const ist, sagt etwas über interne Kopien aus?

    Nein, aber die Tatsache, dass es ein string ist. Aus dem char-Zeiger, den s.c_str() zurückgibt, konstruiert sich ein temporärer string, der per const-Referenz an den Konstruktor von runtime_error übergeben wird. Danach wird der char-Zeiger nicht mehr benutzt.



  • 🕶 <- blind 👍



  • Selbst wenn er einen string übergeben würde, darf man davon ausgehen, dass die Exception sich eine interne Kopie sichert. Ganz einfach weil es möglich sein sollte, std::runtime_error's erst in der main zu fangen. Wenn ich z.B. einen aus meinem Framework werfe, müsste ich bei Referenzhaltung den übergebenen String unbedingt als statische globale oder statische funktionslokale Variable ablegen, weil alles andere beim stack unwinding irgendwann abgeräumt würde. Die Fehlermeldung dann erst beim Entstehen des Fehlers zusammenzubasteln wäre dann ein ziemlicher Krampf.


Anmelden zum Antworten