Heim >Backend-Entwicklung >C++ >Warum sind nicht-virtuelle Methodenaufrufe für NULL-Zeiger erfolgreich, während virtuelle Methodenaufrufe in C fehlschlagen?

Warum sind nicht-virtuelle Methodenaufrufe für NULL-Zeiger erfolgreich, während virtuelle Methodenaufrufe in C fehlschlagen?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-13 10:03:10472Durchsuche

Why Do Non-Virtual Method Calls on NULL Pointers Succeed While Virtual Method Calls Fail in C  ?

Zugriff auf Klassenmitglieder mit einem NULL-Zeiger: Untersuchung des Verhaltens nichtvirtueller Methoden

Frage:

Warum ist ein nicht-virtueller Methodenaufruf bei einem NULL-Zeiger in C erfolgreich, während ein virtueller Methodenaufruf stürzt das Programm ab?

Antwort:

Verhalten nicht-virtueller Methoden:

Wenn eine nicht-virtuelle Methode auf einem NULL-Zeiger aufgerufen wird, generiert der Compiler Code, der die Implementierung der Methode direkt aufruft. Dies wird erreicht, indem der Funktion ein versteckter Parameter „this“ übergeben wird, der im Fall eines NULL-Zeigers nirgendwo zeigt. Die Methode selbst versucht jedoch nicht, auf Mitglieder des Objekts zuzugreifen, sodass der Code die Dereferenzierung des NULL-Zeigers vermeidet und wie vorgesehen funktioniert.

Formale Definition:

Es ist jedoch wichtig zu beachten, dass der Aufruf einer beliebigen Methode auf einem NULL-Zeiger formal als undefiniertes Verhalten in C gilt. Dies bedeutet, dass der Compiler willkürliche Entscheidungen darüber treffen kann, was passiert, einschließlich der scheinbar korrekten Ausführung des Programms.

Verhalten virtueller Methoden:

Aufrufe virtueller Methoden erfordern eine vtable Suchen Sie nach, um zu bestimmen, welche Implementierung aufgerufen werden soll. Die vtable ist mit dem eigentlichen Objekt verknüpft, daher führt der Aufruf einer virtuellen Methode auf einen NULL-Zeiger, der keine verknüpfte vtable hat, zu einem Absturz.

Objektzuordnung:

Die Variable „foo“ im bereitgestellten Code ist eine lokale Variable, die auf dem Stapel der Hauptfunktion zugewiesen ist. Es wird jedoch mit einem NULL-Zeiger initialisiert, was darauf hinweist, dass es auf kein gültiges Objekt vom Typ Foo zeigt.

Das obige ist der detaillierte Inhalt vonWarum sind nicht-virtuelle Methodenaufrufe für NULL-Zeiger erfolgreich, während virtuelle Methodenaufrufe in C fehlschlagen?. 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