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!