我注意到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;
的代碼將不再有未定義的行爲,還是我失去了一些東西?
你看錯了。它說'delete'需要'new'或'new(std :: nothrow)'返回的指針,而'delete []'需要'new []'或'new(std :: nothrow)返回的指針)[]'。就像它一直如此。 –
這是一個很好的理由。每個編譯器廠商都知道它是未定義的行爲,並將其視爲這樣。該標準將說明這些供應商認爲應該說些什麼。 – MSalters