2

我注意到C++ draft作爲e51a2152不再包括下列措詞:不匹配刪除不再未定義的行爲?

如果在標準庫提供給operator delete(void*)值不是由以前調用返回的值中的一個的行爲是未定義任一operator new(std::size_t)operator new(std::size_t, const std::nothrow_t&),如果在標準庫中提供給operator delete[](void*)的值不是以前在標準庫中調用operator new[](std::size_t)operator new[](std::size_t, const std::nothrow_t&)所返回的值中的一個,則行爲未定義。

這是否意味着像

int * const p = new int[42]; 
delete p; // instead of delete[] p; 

的代碼將不再有未定義的行爲,還是我失去了一些東西?

+0

你看錯了。它說'delete'需要'new'或'new(std :: nothrow)'返回的指針,而'delete []'需要'new []'或'new(std :: nothrow)返回的指針)[]'。就像它一直如此。 –

+0

這是一個很好的理由。每個編譯器廠商都知道它是未定義的行爲,並將其視爲這樣。該標準將說明這些供應商認爲應該說些什麼。 – MSalters

回答

4

無論如何,該段涉及分配/釋放功能。錯配new/delete表達式在[expr.delete]/2處理,其仍保持不變:

在第一種方式(刪除對象)的 的操作數的值刪除可以是空指針值,指針到非由之前的新表達式創建的數組對象 ,或指向表示此類對象的基類(子句 [class.derived])的子對象 ([intro.object])的指針。如果不是,則行爲未定義。在第二個 替代(刪除數組)中,刪除操作數的值可能是 空指針值或由前 數組新表達式產生的指針值。 如果不是,則行爲未定義。

1

措辭被簡單地移動到描述爲operator delete

[new.delete.single]/12:需要:ptr應是一個空指針或它的值應表示由先前調用分配給存儲器的塊的地址(可能被替代)operator new(std::size_t)operator new(std::size_t, std::align_val_t),該號碼未被對operator delete的中間呼叫無效。

請參閱here以瞭解GitHub回購中的更改。陣列版本有類似的措辭。沒有任何東西在語義上發生了變化,它只是它在標準中表達的方式。

+1

請注意,該標準指定'operator new []'的默認實現調用'operator new'並返回結果。因此,如果 - 如果 - 如果 - 如果沒有替換數組窗體的默認實現,我認爲可以讀取措辭以允許調用'operator new []'返回的操作符'operator delete'。 –