Heim  >  Artikel  >  Backend-Entwicklung  >  Ist die Verwendung eines von einem gelöschten Zeiger abgeleiteten Zeigers in C gültig?

Ist die Verwendung eines von einem gelöschten Zeiger abgeleiteten Zeigers in C gültig?

Linda Hamilton
Linda HamiltonOriginal
2024-11-01 06:30:30441Durchsuche

Is using a pointer derived from a deleted pointer valid in C  ?

Zeiger nach dem Löschen in C: Der verwirrende Fall von a und b

In der Welt der C-Zeiger ist der Vorgang des Löschens eines zugewiesenen Speicher durch Löschen wirft Fragen zur Gültigkeit von Zeigern auf, die auf diesen Speicher verweisen. Stellen Sie sich das folgende Szenario vor:

<code class="cpp">A* a = new A();
A* b = a;

delete a;

A* c = a; // illegal in C++11
A* d = b; // legal?</code>

Der Kern der Frage besteht darin, die Gültigkeit der Verwendung des Werts des Zeigers b zu bestimmen, nachdem a gelöscht wurde.

Das Schicksal von Ungültige Zeiger: Undefiniertes Verhalten in C 11, Implementierungsdefiniert in C 14

In C 11 führt der Zugriff auf den Wert eines gelöschten Zeigers (a) zu undefiniertem Verhalten. Die Verwendung eines Zeigers (b), der vom gelöschten Zeiger abgeleitet wurde, stellt jedoch eine nuancierte Situation dar.

Unter C 11 gilt sowohl c = a; und d = b; gelten als undefiniertes Verhalten. Dies liegt daran, dass sowohl a als auch b als „ungültige Zeigerwerte“ gelten, da sie auf freigegebenen Speicher verweisen. Jeder Versuch, Operationen an ungültigen Zeigern auszuführen, ist explizit undefiniert.

Implementierungsdefinierte Feinheiten in C 14

C 14 führt subtile Änderungen an diesem Szenario ein. Gemäß dem überarbeiteten Standard umfasst die „Verwendung eines ungültigen Zeigerwerts“ auch „das Kopieren des Werts von“. Daher gelten in C 14 beide Zuweisungen an c und d als durch die Implementierung definiert.

Der Grund für diese Änderung besteht darin, dass das Kopieren eines ungültigen Zeigerwerts bei bestimmten Implementierungen möglicherweise einen Laufzeitfehler auslösen könnte. Der Standard überlässt es klugerweise der Implementierung, solche Fälle nach eigenem Ermessen zu behandeln.

Zusammenfassend lässt sich sagen, dass die Rechtmäßigkeit der Verwendung von b nach der Löschung von a von der verwendeten C-Version abhängt. C 11 geht davon aus, dass sowohl c = a; und d = b; undefiniertes Verhalten, während C 14 die Verantwortung auf die Implementierung verlagert und das Ergebnis im Standard nicht spezifiziert lässt.

Das obige ist der detaillierte Inhalt vonIst die Verwendung eines von einem gelöschten Zeiger abgeleiteten Zeigers in C gültig?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn