- 1. Beispielcode
- 2. Erläuterung
- 3. Fazit
Analysieren wir ein kleines Codebeispiel, wenn eine Methode für ein Objekt aufgerufen wird, das mit nullptr initialisiert wurde.
Beispielcode
Wir erhalten den folgenden Code.
#include <iostream> using namespace std; struct X { X* self() { cout << "call method of nullptr" << endl; if (!this) { cout << "object does not exist" << endl; return nullptr; } cout << "object exist" << endl; return this; } }; int main() { X* x = nullptr; if (x->self()) { return 0; } return 0; }
Erläuterung
Glauben Sie, dass das Programm in diesem Fall abstürzt? Und wenn nicht, was wird auf der Konsole ausgegeben?
In der Regel wird das Programm in den meisten Fällen nicht abstürzen. Aber das ist unbekannt. Dieser Code ist ein Beispiel für undefiniertes Verhalten, d. h. Undefiniertes Verhalten . Das Verhalten des Programms wird durch die interne Implementierung des Compilers bestimmt und liefert kein garantiertes Ergebnis. Das heißt, der Absturz des Programms und die korrekte Ausführung des Programms sind gleichermaßen richtige Antworten.
Was passiert, wenn das Programm ordnungsgemäß funktioniert?
Antwort: Die folgende Meldung wird in der Konsole angezeigt
call method of nullptr object does not exist
Das heißt, die Methode wird als statische Methode ausgeführt, als ob wir auf eine statische Klassenmethode zugreifen würden. Dies ist möglich, da Objekttyp, Signatur und Implementierung der aufgerufenen Methode bekannt sind. Dabei wird nicht auf die internen Variablen der Klasse zugegriffen. Und wenn Sie nach this suchen, können Sie sicherstellen, dass das Objekt existiert. Sie können auf diese Prüfung auch verzichten, der Code wird trotzdem solange ausgeführt, bis er auf einen Teil des Codes trifft, der das erstellte Objekt benötigt.
Fazit
Dieser Code ist jedoch ein Beispiel für undefiniertes Verhalten – Undefiniertes Verhalten . Daher wird von solchen Tricks in der Softwareentwicklung dringend abgeraten. Denn selbst wenn der Code jetzt funktioniert, funktioniert er möglicherweise in der nächsten Version des Compilers nicht mehr. Denken Sie also zweimal nach, bevor Sie dies schreiben.