Heim >Backend-Entwicklung >C++ >Warum ist ein nicht-virtueller Funktionsaufruf bei einem NULL-Zeiger erfolgreich, während ein virtueller Funktionsaufruf fehlschlägt?
Zugriff auf Klassenmitglieder mit einem NULL-Zeiger: Anomalien und Erklärungen
Im bereitgestellten C-Code-Snippet wurde beobachtet, dass ein Funktionsaufruf von Eine nicht-virtuelle Methode war auch dann erfolgreich, wenn der Objektzeiger NULL war, während ein virtueller Funktionsaufruf zum Absturz der Anwendung führte. Dieses merkwürdige Verhalten wirft zwei grundlegende Fragen auf:
1. Wie funktioniert eine nicht-virtuelle Methode mit einem NULL-Zeiger?
Im Gegensatz zu einem virtuellen Funktionsaufruf erfordert ein nicht-virtueller Funktionsaufruf keine Vtable-Suche. Der Compiler übersetzt den Funktionsaufruf direkt in eine Maschinencodeanweisung, die auf die spezifische auszuführende Funktion verweist. Der Funktion wird als versteckter Parameter ein Zeiger auf das Objekt übergeben, für das die Funktion aufgerufen wird.
Im angegebenen Code verweist die Funktion say_hi() nicht auf Mitglieder der Foo-Klasse. Daher kann es ausgeführt werden, ohne dass der This-Zeiger dereferenziert werden muss. Im Wesentlichen ist der Aufruf von say_hi() äquivalent zu:
void Foo_say_hi(Foo* this); Foo_say_hi(foo); // where foo is NULL
Da die Funktion nie versucht, auf die Mitglieder des Objekts zuzugreifen, tritt das undefinierte Verhalten der Dereferenzierung eines NULL-Zeigers nicht auf.
2. Wo wird das Objekt foo zugewiesen?
Im bereitgestellten Code wird foo als lokale Variable vom Typ Foo* deklariert. Da ihr keine bestimmte Speicherzuweisung zugewiesen wird, wird sie höchstwahrscheinlich wie andere lokale Variablen auf dem Stapel für die Hauptfunktion zugewiesen. Der in foo gespeicherte Wert ist jedoch ein NULL-Zeiger, was darauf hinweist, dass er nicht auf eine gültige Objektinstanz vom Typ Foo zeigt.
Das obige ist der detaillierte Inhalt vonWarum ist ein nicht-virtueller Funktionsaufruf bei einem NULL-Zeiger erfolgreich, während ein virtueller Funktionsaufruf fehlschlägt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!