通過指向沒有虛擬解構函式的基類的指標刪除派生物件

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

如果要刪除的物件的靜態型別與其動態型別不同,則靜態型別應為要刪除的物件的動態型別的基類,靜態型別應具有虛擬解構函式或行為未定義。

無論派生類是否將任何資料成員新增到基類,都是這種情況。