【问题标题】:virtual destructor fail using array虚拟析构函数使用数组失败
【发布时间】:2011-12-06 23:02:01
【问题描述】:

我在 web site 上找到了此代码

#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
}

为什么是crash

【问题讨论】:

标签: c++ polymorphism segmentation-fault new-operator virtual-destructor


【解决方案1】:
Base *bq = new Der[5];
delete [] bq;   // this causes runtime error

原因是数组没有被处理多态。因此,在上面的代码中,delete 语句调用了未定义的行为

§5.3.5/3 C++03 说

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

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

【讨论】:

  • 在 C++11 中似乎仍然如此。同节:5.3.5/3
猜你喜欢
  • 2017-03-16
  • 2022-01-01
相关资源
最近更新 更多