Exception mit String Literal korrekt?



  • Es geht um folgenden Code:

    void func() {
       throw "Test";
    }
    
    void main() {
       try { func(); } catch(char* ptr) {cout << ptr;};
    }
    

    Ich war bis jetzt immer der Meinung das ein String Literal ungültig (aka koennte wieder überschrieben werden) wird nachdem der Scope/Funktionscope verlassen wird.

    Liege ich da Korrekt und der obige Code ist falsch?



  • Nein, du liegst falsch -)

    Ein String-Literal ist ein konstanter Ausdruck, der im DATA-Part der Anwendung abgelegt wird (d.h. er wird beim Programmstart in den Hauptspeicher geladen und erst beim Beenden des Programms vom Betriebssystem wieder verworfen).
    Mit anderen Worten: er wird nicht auf dem Stack abgelegt.

    Nichtsdestotrotz sollte man besser eigene Exception-Klassen (am besten von std::runtime_error oder std::logic_error abgeleitet) verwenden.


  • Mod

    Anzumerken ist noch, dass obige catch-Klausel das von func geworfene Exception-Objekt nicht fangen kann, denn das Exception-Objekt ist vom Typ const char* .



  • wird aber trotzdem gefangen.



  • Ja, was es alles für nicht-standardkonforme Compiler gibt...



  • Hmm? Stringliterale sind doch implizit in char* konvertierbar (4.2/2) oder gilt das nicht für catch?


  • Mod

    .filmor schrieb:

    Hmm? Stringliterale sind doch implizit in char* konvertierbar (4.2/2) oder gilt das nicht für catch?

    Das ist schon richtig, nur ist das Argument des Exception-Handlers kein Stringliteral. Es gibt sogar eine imo überflüssige Notiz deswegen im Standard (15.1/3).


Anmelden zum Antworten