Der Zeiger wird nicht benötigt, um die Methode aufzurufen. Der Typ des Zeigers ist bekannt, daher ist der Code für die Methode bekannt. Die Methode verwendet nicht this
, daher wird der Code problemlos ausgeführt. Es ist undefiniertes Verhalten, aber es ist effizienter, nicht zu überprüfen, ob der Zeiger NULL ist, also läuft es.
Wenn Sie sich die Assembly ansehen (für mindestens einen Compiler), können Sie sehen, warum sie ausgeführt wird (obwohl es ein undefiniertes Verhalten ist, wie viele darauf hingewiesen haben). Für diese zwei Zeilen:
%Vor%Diese Assembly wird generiert (in einem Compiler, den ich gerade probiert habe):
%Vor%Es drückt den NULL (0) auf den Stapel und ruft die Methode auf, da die Adresse der Methode unabhängig von der tatsächlichen Objektinstanz ist.
Zunächst einmal ist es nicht gültig, da es undefiniertes Verhalten aufruft. Sie fragen sich wirklich, warum der Compiler dies erlaubt, und die Antwort ist, weil es sich um boneheaded Code handelt, der in einer realen Anwendung einfach nicht vorkommen wird, also warum? Das eigentliche Problem tritt auf, wenn der Zeiger zur Laufzeit auf eine Weise ungültig gemacht wird, die von der statischen Codeanalyse nicht erwartet werden kann.
Der Compiler ist nicht da, um Ihre Hand zu halten, er ist dazu da, Ihren Code nach dem Standard zu kompilieren. Wenn es dann nützliche Warnungen bietet, aber da nichts syntaktisch oder semantisch illegal ist, schreiben Sie einfach Code, der undefiniertes Verhalten verursacht.
Tags und Links c++