通過指向沒有虛擬解構函式的基類的指標刪除派生物件
class base { };
class derived: public base { };
int main() {
base* p = new derived();
delete p; // The is undefined behavior!
}
在[expr.delete]§5.3.5/ 3 節中,標準說如果在靜態型別沒有 virtual
解構函式的物件上呼叫 delete
:
如果要刪除的物件的靜態型別與其動態型別不同,則靜態型別應為要刪除的物件的動態型別的基類,靜態型別應具有虛擬解構函式或行為未定義。
無論派生類是否將任何資料成員新增到基類,都是這種情況。