Warum funktioniert die Aufrufmethode über den Nullzeiger in C ++? [Duplikat]

7
%Vor%

klar, es wird kein ctor aufgerufen. Ist das Standard? oder nur eine Compiler-Optimierung, da dieser Zeiger nicht in der member-Funktion show () verwendet wird?

    
bbc 04.07.2012, 00:05
quelle

4 Antworten

22

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.

    
Ned Batchelder 04.07.2012, 00:07
quelle
8

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.

    
Mark Wilkins 04.07.2012 00:15
quelle
1

Es ist nicht gültig, das Verhalten ist nicht definiert und die tatsächlichen Ergebnisse hängen von Ihrem Compiler ab.

    
Soren 04.07.2012 00:08
quelle
-1

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.

    
Ed S. 04.07.2012 00:09
quelle

Tags und Links