Nullpointer Zugriff funktioniert?
-
Hallo!
Kann mir einer erklären warum das Programm hier funktioniert?!
Mein Weltbild von einem Null-Pointer gerät ins schwanken...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.
-
#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!