Nullpointer Zugriff funktioniert?



  • Hallo!

    Kann mir einer erklären warum das Programm hier funktioniert?!
    Mein Weltbild von einem Null-Pointer gerät ins schwanken...

    Wieso geht das?

    Die Bilder 1 und 2 zeigen nur die Werte von Input und Input->isDown().

    Das Bild 3 und 4 zeigen den Code nach einem StepInto(F11) und einen StepOver(F10).

    Wie kann das mit dem Nullpointer funktionieren?!



  • Lies mal das hier.



  • Undefiniertes Verhalten

    #include <iostream>
    using namespace std;
    
    class undefiniertes_verhalten
    {
    public:
      void hervorrufen() {
        cout << "bin ich noch da?\n";
      }
    };
    
    int main() {
      undefiniertes_verhalten* ub = 0;
      ub->hervorrufen();
    }
    


  • @Drakon
    Wow, danke.

    D.h. es knallt erst wenn der this pointer benötigt wird.
    Und das ist nur dann der fall wenn Membervariablen angesprochen werden, richtig?

    @Uh-Beh!
    So wie ich das verstanden habe ist das nicht undefiniert, sondern einfach nur unschön. Denn was passiert ist immer eindeutig.



  • Was da auf der Maschine wahrscheinlich passiert, ist, dass die nicht-virtuelle Methode zur Linkzeit gebunden wird und sich wie eine normale Funktion verhält. Dann ist

    struct foo { void bar() { } };
    
    foo f;
    foo.bar();
    

    nicht groß anders als

    struct foo { };
    void bar(foo *self) { }
    
    foo f;
    bar(&f);
    

    Wenn die Methode nicht auf die Daten des Objektes zugreift, kann so was funktionieren.

    ABER: Dieses Verhalten ist undefiniert. Ein Compiler darf hier durchaus Code erzeugen, der mit Null-Zeigern nicht funktioniert. Wenn so was im Debugger auftaucht, passiert es im Zweifel wie oben beschrieben, aber ein Bug ist es trotzdem.



  • Hab grad noch den Nachtrag von drakons link gelesen, das es doch nicht definiert ist. Muss ich mir mal genauer ansehen.
    Danke!


Anmelden zum Antworten