我在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/