Was ist daran "falsch"



  • Folgender Code, was ist alles nicht standardkonform bzw. illegal:

    #include <iostream>
    using namespace std;
    
    class foo {
    public:
        void bar () {
            cout << "foo::bar\n";
        }
    };
    
    int main () {
        foo &boo = *new foo;
        delete &boo;
        boo.bar ();
    }
    

    Comeau sagt:

    Comeau C/C++ 4.3.1 (Mar 1 2003 20:09:34) for ONLINE_EVALUATION_BETA1
    Copyright 1988-2003 Comeau Computing. All rights reserved.
    MODE:strict errors C++
    In strict mode, with -tused, Compile succeeded (but remember, the Comeau online compiler does not link).

    und beim MSVC wird auch ein "foo::bar" ausgegeben.

    2.: Wenn ich den this Zeiger in foo::bar benutzen würde, würde es dann illegaler
    Code sein, wenn es nicht schon welcher ist?



  • Illegal, da Du eine Referenz auf etwas benutzt, das dir nicht gehört.



  • Der Code ist legal, auch wenn er auf den ersten Blick nicht so aussieht.



  • Der Code ist legal, auch wenn er auf den ersten Blick nicht so aussieht.

    Tatsächlich. Ich halte 3.7.4.2/4 des C++ Standards dagegen und sage die Zeile

    boo.bar ();
    

    nach dem delete resultiert in undefiniertem Verhalten.

    Was sind deine Argumente?



  • hab den standard zurzeit nicht zur verfügung (bitte schreiben was da steht, und noch viel mehr bitte deine interpretation auf deutsch :D)



  • Ich halte 3.7.4.2/4 des C++ Standards dagegen und sage die Zeile

    Das muss übrigens 3.7.3.2/4 heißen.

    Dort wird geschrieben, dass ein delete den durch das Argument referenzierten Speicher freigibt und das damit *alle* Referenzen auf diesen Speicher (oder auf Teile von diesem) ungültig werden. Jede Benutzung einer solchen nun ungültigen Referenz führt zu undefiniertem Verhalten.


Anmelden zum Antworten