Der Zugriff auf Klassenmitglieder über einen Nullzeiger führt normalerweise zu einem Absturz. Allerdings scheinen in C bestimmte nicht-virtuelle Methoden auch mit Nullzeigern zu funktionieren. Dieses Verhalten wirft mehrere Fragen auf: Wie kommt es dazu und wo ist das Objekt zugeordnet?
In C, wenn eine nicht-virtuelle Methode für eine Null aufgerufen wird Zeiger generiert der Compiler einen direkten Aufruf der Funktion, die dieser Methode zugeordnet ist. Dies geschieht durch die Übergabe eines versteckten Parameters (Zeiger auf das Objekt) an die Funktion.
Im bereitgestellten Beispiel:
class Foo { void say_hi(); }; Foo* foo = nullptr; foo->say_hi();
Der Compiler wandelt dies in Folgendes um:
void Foo_say_hi(Foo* this); Foo_say_hi(foo);
Da die Methode say_hi niemals auf die Mitglieder des Objekts verweist, dereferenziert sie den Nullzeiger nicht und vermeidet somit das Fehler.
Formal gesehen ist der Aufruf einer beliebigen Methode auf einem Nullzeiger undefiniertes Verhalten. Allerdings können Compiler den Code optimieren, indem sie davon ausgehen, dass das Objekt nicht null ist. Dies ist riskant, da es zu unerwartetem Verhalten führen kann.
Im Fall des Beispiels optimiert der Compiler den nicht-virtuellen Methodenaufruf, um einen Absturz zu vermeiden. Es ist jedoch wichtig zu beachten, dass dieses Verhalten nicht garantiert ist. Der Aufruf nicht-virtueller Methoden für Nullzeiger sollte dennoch vermieden werden, da dies zu nicht spezifizierten Ergebnissen führen kann.
Das Objekt, auf das der foo-Zeiger im Beispiel verweist, wird innerhalb des nicht zugewiesen Hauptfunktion. Auf dem Stapel wird eine lokale Variable vom Typ Foo* erstellt und der ihr zugewiesene Wert ist ein Nullzeiger. Das bedeutet, dass das Objekt selbst nirgendwo im Speicher existiert.
Das obige ist der detaillierte Inhalt vonWarum vermeiden nicht-virtuelle Methodenaufrufe auf Nullzeiger manchmal Abstürze in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!