【发布时间】:2011-09-25 18:16:03
【问题描述】:
我在 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 类中的双精度时,没有分段错误并且析构函数按预期的顺序(复杂,数字)调用,所以我猜这个问题是相关的到对象的大小,谁能给我一个解释? 谢谢, 阿米特。
【问题讨论】:
-
@AndersK。这应该到处都失败。
-
代码表现出未定义的行为,问题是重复的:stackoverflow.com/questions/7197677/…
-
我似乎每天都在学习新东西。仍然。
-
当然还有
boost::ptr_vector<Number>或std::vector<std::unique_ptr<Number>>等...
标签: c++ destructor