2015-02-08 58 views
1

假设我有此代码 - 此代码什么都不做,我知道它们是内存泄漏,因为汽车的析构函数并不是虚拟的。但我不明白为什么我得到这个代码的调试断言。我使用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

为了使析构函数virtual,你需要将其在基类声明这样

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

不这样做,你的代码有undefined behaviour

0

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

honda的析构函数不是虚拟的时候声明消失的原因是它变得很好定义。虽然,建议让基类析构函数为虚拟的,以通过继承层次结构获取销毁调用。