此代码中调试断言的原因

时间:2015-02-08 06:09:44

标签: c++ destructor c++03

假设我有这段代码 - 这段代码什么都不做,我明白它们是内存泄漏,因为汽车的析构函数不是虚拟的。但是我不明白为什么我得到这个代码的调试断言。我正在使用visual studio 2010。

struct car {
    ~car() 
    {std::cout << "Destructor of car";  }
};
struct honda: public car {
     virtual ~honda()
    { std::cout << "Destructor of honda"; }
};

int main()
{
    car *c = new honda();
    delete c;
}

如果honda类的析构函数未声明为虚拟,我不会得到此断言。我想知道那是什么问题?

2 个答案:

答案 0 :(得分:2)

要制作析构函数virtual,您需要在基类中将其声明为

struct car {
    virtual ~car() {std::cout << "Destructor of car";  }
 // ↑↑↑↑↑↑↑
};

如果没有这个,您的代码就会有undefined behaviour

答案 1 :(得分:0)

要使派生类析构函数为虚拟,您必须将基类析构函数设置为虚拟。 有关详细说明,请参阅C++ assertion error while deleting object

honda的析构函数不是虚拟的时,断言消失的原因是它变得很明确。尽管如此,建议将基类析构函数设置为虚拟,以通过继承层次结构获取销毁调用。