Heim >Backend-Entwicklung >C++ >Warum führt der Aufruf einer nicht virtuellen Methode auf einem NULL-Zeiger nicht zu undefiniertem Verhalten?

Warum führt der Aufruf einer nicht virtuellen Methode auf einem NULL-Zeiger nicht zu undefiniertem Verhalten?

Susan Sarandon
Susan SarandonOriginal
2024-12-31 18:44:13259Durchsuche

Why Does Calling a Non-Virtual Method on a NULL Pointer Not Result in Undefined Behavior?

Zugriff auf Klassenmitglieder mit einem NULL-Zeiger

Obwohl die foo-Variable als Zeiger auf eine Instanz vom Typ Foo deklariert ist, wird sie mit initialisiert 0, was ihn zu einem Nullzeiger macht. Dies mag kontraintuitiv erscheinen, da der Zugriff auf Mitglieder eines Nullzeigers typischerweise ein undefiniertes Verhalten ist. Bestimmte Umstände erlauben dieses Verhalten jedoch.

Nicht-virtueller Methodenaufruf

Die nicht-virtuelle Methode say_hi() wird trotz des Nullzeigers erfolgreich aufgerufen, da dies nicht der Fall ist eine virtuelle Methode. Virtuelle Methoden erfordern ein gültiges Objekt, um anhand des Objekttyps zu bestimmen, welche Funktion aufgerufen werden soll. Nicht-virtuelle Methoden hingegen verfügen über eine vorgegebene Funktionsadresse, die der Compiler verwendet, um eine direkte Funktionsaufrufanweisung zu generieren.

Im Einzelnen generiert der Compiler Code, der dem folgenden entspricht:

void Foo_say_hi(Foo* this);
Foo_say_hi(foo);

Da die Funktion say_hi() nicht auf diesen Zeiger verweist, entfällt die Notwendigkeit, eine potenzielle Null zu dereferenzieren Zeiger.

Objektzuordnung

Die foo-Variable ist eine lokale Variable innerhalb der Hauptfunktion und wird daher auf dem Stapel der Funktion zugewiesen. Als Zeigervariable wird das eigentliche Objekt, auf das sie zeigt, hier nicht zugewiesen. Der Nullwert gibt an, dass der Zeiger nicht auf ein gültiges Objekt verweist.

Das obige ist der detaillierte Inhalt vonWarum führt der Aufruf einer nicht virtuellen Methode auf einem NULL-Zeiger nicht zu undefiniertem Verhalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn