Heim  >  Artikel  >  Backend-Entwicklung  >  Was passiert mit Zeigern, nachdem der Speicher, auf den sie in C verweisen, gelöscht wird?

Was passiert mit Zeigern, nachdem der Speicher, auf den sie in C verweisen, gelöscht wird?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-01 01:48:02993Durchsuche

What Happens to Pointers After Deleting the Memory They Point To in C  ?

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!

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