Die überprüfung auf eine null-Referenz?
Können sagen, Sie haben so etwas wie dieses:
int& refint;
int* foo =0;
refint = *foo;
Wie könnte man überprüfen, ob die Referenz ist NULL
zu vermeiden, ein Absturz?
- Sie ziehen die Entwickler, die schrieb, dass in einem dunklen Raum mit einem Stuhl und ein Licht scheint auf ihn. Dann Sie verbrennen mit Zigaretten, bis Sie umkehren.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht spät-Initialisierung eine Referenz, wie, dass. Es muss initialisiert werden, wenn es erklärt wird.
Auf Visual C++ bekomme ich
mit Ihrem code.
Wenn Sie "reparieren" den code, der crash (streng, Undefiniertes Verhalten) geschieht im Referenz-Nutzungsdauer in VC++ v10.
Den Weg zu machen, das sicher ist, um die Zeiger auf Referenz-Initialisierung oder Zuweisung Zeit.
obwohl das noch keine Garantie
foo
Punkte, die den nutzbaren Speicher, noch, dass es bleibt so, während die Referenz im Bereich.Nicht, durch die Zeit, die Sie haben ein "null" - Referenz, die Sie bereits haben Undefiniertes Verhalten. Sie sollten immer prüfen, ob ein Zeiger null ist, bevor Sie versuchen zu bilden, eine Referenz dereferenzieren der Zeiger.
(Ihr code ist illegal; Sie können nicht erstellen Sie eine nicht initialisierte Referenz und versuchen Sie es und binden Sie es durch zuweisen; Sie können nur binden Sie es während der Initialisierung.)
Im Allgemeinen, Sie können nicht.
Wer "erzeugt eine null-Referenz" (oder versucht, sollte ich sagen) hat bereits aufgerufen Undefiniertes Verhalten, so könnte der code (oder auch nicht) Absturz, bevor Sie eine chance bekommen, um zu überprüfen, nichts.
Wer erstellt den Verweis getan haben sollte:
Normalerweise ist es als des Anrufers problem, wenn Sie geschrieben haben
*foo
wennfoo
null ist, und es ist nicht eine Funktion die Pflicht zu prüfen, für diese Art von Fehler in dem code anderer Funktionen. Aber man könnte Wurf Dinge wieassert(&refint);
durch den code. Sie können helfen, fangen Fehler gemacht, indem Sie Ihre Anrufer, da alle nach für jede Funktion, die Sie schreiben, es ist eine vernünftige chance, die der Anrufer sich selbst.Alle der oben genannten Antworten sind korrekt, aber wenn aus irgendeinem Grund Sie dies tun wollen, ich dachte, mindestens eine person sollte eine Antwort. Ich bin derzeit versucht, auf die Spur eines schlechten Verweises in einigen source-code, und es wäre nützlich, um zu sehen, wenn jemand gelöscht hat, diese Referenz, und setzen Sie es auf null irgendwann. Hoffentlich nicht generieren zu viele nach unten Stimmen.
Ausgabe:
Machen Sie den obigen code kompilieren, müssen Sie zum ändern der Reihenfolge:
(Möglicherweise ältere Prozessor-oder Laufzeit-Architekturen, in denen dies funktioniert.)
....sagen alle der oben genannten, wenn Sie tun wollen ein null-Verweis ist, verwenden
boost::optional<>
, funktioniert wie ein Charme..Brauchen Sie nicht, Referenzen darf nicht null sein.
Lesen Sie die Bedienungsanleitung.