Heim > Backend-Entwicklung > C++ > Warum ist ein nicht-virtueller Funktionsaufruf bei einem NULL-Zeiger erfolgreich, während ein virtueller Funktionsaufruf fehlschlägt?

Warum ist ein nicht-virtueller Funktionsaufruf bei einem NULL-Zeiger erfolgreich, während ein virtueller Funktionsaufruf fehlschlägt?

Susan Sarandon
Freigeben: 2025-01-03 20:43:41
Original
511 Leute haben es durchsucht

Why Does a Non-Virtual Function Call Succeed on a NULL Pointer While a Virtual Function Call Fails?

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
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage