簡體   English   中英

在C ++標准中它說的是什么:: delete可以改變左值?

[英]Where in the C++ Standard does it say ::delete can change lvalues?

我遇到了第一個改變傳遞給:: delete的左值的編譯器,但沒有將左值歸零。 這是以下情況:

 Foo * p = new Foo();
 Foo * q = p;
 assert(p != 0);
 assert(p == q);
 ::delete p;
 assert(p != q);
 assert(p != 0);

請注意,刪除操作后p不為零,並且已從其舊值更改。 一位同事告訴我,他在使用一些將p改為0xFFFFFFFF的大型機C ++編譯器以及將p改為0的其他編譯器的經驗並不罕見。

在C ++標准中,它是否允許編譯器執行此操作?

通過StackOverflow搜索,我發現了這個問題: 為什么不刪除將指針設置為NULL? 有一個答案提到Bjarne Stroustrup的答復 ,其中包括聲明:

C ++顯然允許delete的實現將左值操作數歸零,我曾希望實現會這樣做,但這個想法似乎並沒有受到實現者的歡迎。

我已經閱讀並重新閱讀了最終委員會草案C ++ 0x標准的第5.3.5和12.5節,但我沒有看到“明確”部分。 我只是在尋找標准的錯誤部分嗎? 或者這些部分中是否存在一系列邏輯,但我只是沒有正確連接在一起。

我沒有Annotated C ++ Reference Manual的副本了。 編譯器是否可以在ARM中執行此操作?

[編輯:將部分參考從3.5.3更正為5.3.5。 我還添加了一個有趣的悖論作為Henk斷言刪除后p未定義的對立點。

如果將p初始化為null,則存在一個有趣的悖論。

 Foo * p = 0;
 Foo * q = p;
 assert(p == 0);
 assert(p == q);
 ::delete p;
 assert(p == q);
 assert(p == 0);

但在這種情況下,行為已有詳細記錄。 當delete獲得一個空指針時,它假設什么也不做,所以p保持不變。

它可能不那么明確。 在5.3.5 / 7中,它表示delete表達式將調用deallocator函數。 然后在3.7.3.2/4中,它說使用已經解除分配的指針是未定義的。 由於在重新分配后不能使用指針的值,因此指針是保持值還是由實現改變了值沒有區別。

5.3.5 / 7

delete-expression將調用釋放函數 (3.7.3.2)。

3.7.3.2/4

如果給標准庫中的釋放函數賦予的參數是一個不是空指針值的指針(4.10),則釋放函數將釋放指針引用的存儲,使所有指向引用任何部分的指針無效。解除分配存儲。 使用無效指針值(包括將其傳遞給釋放函數)的效果未定義

參考文獻來自現行標准。 在即將推出的標准5.3.5 / 7中已經改寫:

C ++ 0x FD 5.3.5 / 7

如果delete-expression的操作數的值不是空指針值,則delete-expression將調用釋放函數(3.7.4.2)。 否則,未指定是否將調用釋放功能。 [注意:無論對象的析構函數或數組的某個元素是否引發異常,都會調用釋放函數。 - 結束說明]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM