C++ 虚拟析构函数使用数组失败

C++ 虚拟析构函数使用数组失败,c++,polymorphism,segmentation-fault,new-operator,virtual-destructor,C++,Polymorphism,Segmentation Fault,New Operator,Virtual Destructor,我在一台计算机上找到了这个代码 #包括 使用名称空间std; 结构基 { Base(){cout 原因是数组不是多态处理的。因此,在上面的代码中,delete语句调用未定义的行为 §5.3.5/3 C++03 在第一个备选方案(删除对象)中,如果操作数的静态类型与其动态类型不同,则静态类型应为操作数动态类型的基类,并且静态类型应具有虚拟析构函数或行为未定义。在第二个备选方案(删除数组)中如果要删除的对象的动态类型与其静态类型不同,则行为未定义。 幸运的是,它给出了运行时错误,并且您有机会尽快了解

我在一台计算机上找到了这个代码

#包括
使用名称空间std;
结构基
{
Base(){cout
原因是数组不是多态处理的。因此,在上面的代码中,
delete
语句调用未定义的行为

§5.3.5/3 C++03

在第一个备选方案(删除对象)中,如果操作数的静态类型与其动态类型不同,则静态类型应为操作数动态类型的基类,并且静态类型应具有虚拟析构函数或行为未定义。在第二个备选方案(删除数组)中如果要删除的对象的动态类型与其静态类型不同,则行为未定义。


幸运的是,它给出了运行时错误,并且您有机会尽快了解代码中的严重错误。

可能的重复也只是使用std::vector而不是array…或C++0x…中的std::array…在C++11中仍然是这样。同一节:5.3.5/3
#include <iostream>

using namespace std;

struct Base
{
    Base() { cout << "Base" << " "; }
    virtual ~Base() { cout << "~Base" << endl; }

    int i;
};
struct Der : public Base
{
    Der() { cout << "Der" << endl; }
    virtual ~Der() { cout << "~Der" << " "; }

    int it[10]; // sizeof(Base) != sizeof(Der)
};

int main()
{
    Base *bp = new Der;
    Base *bq = new Der[5];

    delete    bp;
    delete [] bq;   // this causes runtime error
}
Base *bq = new Der[5];
delete [] bq;   // this causes runtime error