C 中刪除後的指標:a 和b 的複雜情況
在C 指標的世界中,刪除已分配的指標的行為透過刪除記憶體會引發有關指向該記憶體的指標有效性的問題。考慮以下場景:
<code class="cpp">A* a = new A(); A* b = a; delete a; A* c = a; // illegal in C++11 A* d = b; // legal?</code>
問題的關鍵在於確定 a 被刪除後使用指標 b 的值的有效性。
The Fate of無效指標:C 11 中未定義的行為,C 14 中定義的實作
在C 11 中,存取已刪除指標(a)的值會導致未定義的行為。然而,從已刪除指標派生的指標 (b) 的使用呈現出一種微妙的情況。
在 C 11 下,c = a;且 d = b;被視為未定義的行為。這是因為 a 和 b 都被視為“無效指標值”,因為它們指向已釋放的儲存空間。任何對無效指標執行操作的嘗試都是明確未定義的。
C 14 中實現定義的複雜性
C 14 對此場景引入了微妙的更改。根據修訂後的標準,「使用無效的指標值」包括「複製...的值」。因此,在 C 14 中,對 c 和 d 的賦值均被視為實現定義的。
此變更背後的原因是複製無效的指標值可能會在某些實作上觸發執行時間錯誤。該標準明智地讓實現來處理它認為合適的情況。
總之,刪除 a 後使用 b 的合法性取決於所使用的 C 版本。 C 11 認為 c = a;且 d = b;未定義的行為,而 C 14 將責任轉移給實現,而在標準中未指定結果。
以上是使用從已刪除指標派生的指標在 C 中有效嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!