Heim > Artikel > Backend-Entwicklung > Was passiert mit Zeigern, nachdem der Speicher, auf den sie in C verweisen, gelöscht wird?
Verhalten von Zeigern in C nach dem Löschen
In C wird durch das Löschen eines Zeigers die Zuordnung des Speichers freigegeben, auf den er zeigt. Das Verhalten von Zeigern, die auf diesen gelöschten Speicher verweisen, wird jedoch je nach C-Version undefiniert oder durch die Implementierung definiert.
Beachten Sie den folgenden Code:
<code class="cpp">A* a = new A(); A* b = a; delete a; A* c = a; // Assuming undefined or implementation-defined in C++11 A* d = b; // Supposed to be legal</code>
Lesewert von Kopie des gelöschten Zeigers (b)
In C 11 ist das Lesen des Werts von b, nachdem a gelöscht wurde, ein undefiniertes Verhalten. In C 14 ist es jedoch durch die Implementierung definiert. Dies liegt daran, dass der Zeiger b selbst zu einem „ungültigen Zeigerwert“ wird, nachdem a gelöscht wurde.
Implementierungsdefiniertes Verhalten
In C 14 wird ein ungültiger Zeigerwert verwendet , einschließlich des Kopierens, weist ein durch die Implementierung definiertes Verhalten auf. Dies bedeutet, dass der Compiler entscheiden kann, was in solchen Fällen zu tun ist. In einigen Implementierungen kann es zu einem Laufzeitfehler kommen, während es in anderen zwar den Vorgang zulässt, aber zu undefiniertem Verhalten führt, wenn der Zeiger anschließend verwendet wird.
Legal oder undefiniert?
Daher sind sowohl A* c = a; und A* d = b; sind in C 11 undefiniert und in C 14 durch die Implementierung definiert. Der kopierte Zeigerwert (b) wird als ungültiger Zeigerwert betrachtet und seine Verwendung unterliegt der Definition der Implementierung.
Das obige ist der detaillierte Inhalt vonWas passiert mit Zeigern, nachdem der Speicher, auf den sie in C verweisen, gelöscht wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!