我在C++中有以下代码:

#include <iostream>

class Number
{
public:
    virtual void foo(){std::cout << "Number foo\n";};
    Number (){ std::cout << "Number ctor" << std::endl;}
    virtual ~Number(){ std::cout << "Number dtor" << std::endl;}
};


class Complex : public Number
{
public:
    virtual void foo(){std::cout << "Complex foo\n";};
    Complex (double r=0, double i=0) : _r (r), _i (i)
    { std::cout << "Complex ctor" << std::endl; };
    virtual ~Complex(){ std::cout << "Complex dtor" << std::endl;}
private:
    double _r,_i;
};


int main()
{
    Number *numArr = new Complex [2];
    delete [] numArr;
    return 0;
}

当析构函数被声明为虚拟时,应用程序因分段错误而退出。如果未将其声明为虚拟,则将调用Number类的析构函数(这很明显...)。但是,当析构函数被声明为虚拟的,并且当我在Complex类中删除 double 数时,就没有分段错误,析构函数以预期的顺序(复杂度,数字)被调用,所以我想这个问题是相关的关于物体的大小,有人可以给我一个解释吗?
谢谢,
阿米特

最佳答案

我不确定,但这就是我所怀疑的...

我不知道这是否与以下事实有关:不应将派生类的数组强制转换为基类的数组(它们不相同,请参见:http://www.parashift.com/c++-faq-lite/proper-inheritance.html#faq-21.3):delete如何知道要删除的对象的大小,以调整numArr[0]numArr[1]的指针(查找v表并将this传递给d-tor)

显然,该标准将其明确命名为undefined(5.3.5):

关于c++ - 虚拟dtor分段故障,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7547538/

10-17 02:36