我有下面的代码在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类中移除双精度时,没有分段错误,并且按照预期顺序(Complex,Number)调用析构函数,所以我想这个问题是相关的对象的大小,任何人都可以给我一个解释? 谢谢, 阿米特。
@AndersK。这应该无处不在。 –
该代码展示未定义的行为,并且问题是重复的:http://stackoverflow.com/questions/7197677/base-pointer-to-array-of-derived-objects – AraK
我似乎每天都在学习新的东西。仍然。 –