通过指向没有虚拟析构函数的基类的指针删除派生对象

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

如果要删除的对象的静态类型与其动态类型不同,则静态类型应为要删除的对象的动态类型的基类,静态类型应具有虚拟析构函数或行为未定义。

无论派生类是否将任何数据成员添加到基类,都是这种情况。