虚拟析构函数在特定情况下的实际必要性

Arm*_*yan 0 c++ virtual-destructor

C++ 03 5.3.5.3

在第一个替代(删除对象)中,如果操作数的静态类型与其动态类型不同,则静态类型应为操作数的动态类型的基类,静态类型应具有虚拟析构函数或行为未定义.

这就是理论.然而,问题是一个实际的问题.如果派生类没有添加数据成员怎么办?

struct Base{
   //some members
   //no virtual functions, no virtual destructor
};
struct Derived:Base{
   //no more data members
   //possibly some more nonvirtual member functions
};

int main(){
     Base* p = new Derived;
     delete p; //UB according to the quote above
}
Run Code Online (Sandbox Code Playgroud)

问题是:这是否存在真正危险的现有实施? 如果是这样,你能否描述一下如何在该实现中实现内部代码,使代码崩溃/泄漏或其他什么?我请求你相信,我发誓,我无意依赖这种行为:)

sha*_*oth 6

一个例子是,如果你提供自定义operator newstruct Derived.显然,错误调用operator delete可能会产生毁灭性的结果.