Zeiger in C nach dem Löschen
Betrachten Sie den folgenden Codeausschnitt in C:
<code class="cpp">A* a = new A(); A* b = a; delete a; A* c = a; // Undefined behavior in C++11 A* d = b; // Potentially legal, but uncertain</code>
Dieser Code löst die aus Frage: Was passiert, wenn auf den Wert eines kopierten Zeigers zugegriffen wird, nachdem der ursprüngliche Zeiger gelöscht wurde?
In C 11 führt der Zugriff auf den Wert eines gelöschten Zeigers zu undefiniertem Verhalten. Dies gilt für beide Zeiger a und b. Das Kopieren des Werts von a in c ist ebenfalls undefiniert, da a auf freigegebenen Speicher verweist.
In C 14 wird das Verhalten jedoch durch die Implementierung definiert. Der Standard legt Folgendes fest:
„Die Indirektion über einen ungültigen Zeigerwert und die Übergabe eines ungültigen Zeigerwerts an eine Freigabefunktion haben ein undefiniertes Verhalten. Jede andere Verwendung eines ungültigen Zeigerwerts hat ein durch die Implementierung definiertes Verhalten.“
Daher ist in C 14 der Zugriff auf den Wert von b, der eine Kopie von a ist, ebenfalls durch die Implementierung definiert. Dies könnte möglicherweise zu undefiniertem Verhalten führen, kann aber auch von bestimmten Implementierungen unterschiedlich gehandhabt werden.
Zusammenfassend lässt sich sagen, dass sowohl A* c = a; und A* d = b; sind in C 11 undefiniert und in C 14 durch die Implementierung definiert. Dies liegt daran, dass beide Zeiger a und b nach dem Löschvorgang auf ungültigen Speicher zeigen.
Das obige ist der detaillierte Inhalt vonWas passiert mit kopierten Zeigern in C, nachdem das Original gelöscht wurde?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!