此代码中调试断言的原因
Reason for debug assertion in this code
假设我有这段代码——这段代码什么都不做,我知道它们是内存泄漏,因为 car 的析构函数不是虚拟的。但是我不明白为什么我会得到这段代码的调试断言。我正在使用 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
class 的析构函数未声明为虚拟的,我不会得到此断言。我想知道这有什么问题?
要生成析构函数 virtual
,您需要在基 class:
中这样声明它
struct car {
virtual ~car() {std::cout << "Destructor of car"; }
// ↑↑↑↑↑↑↑
};
没有这个,你的代码有 undefined behaviour.
要使派生的 class 析构函数成为虚拟的,您的基 class 析构函数也必须是虚拟的。
有关详细说明,请参阅 。
当 honda
的析构函数不是虚拟的时断言消失的原因是它变得定义明确。虽然,建议将基础 class 析构函数设置为虚拟的,以便通过继承层次结构进行析构调用。
假设我有这段代码——这段代码什么都不做,我知道它们是内存泄漏,因为 car 的析构函数不是虚拟的。但是我不明白为什么我会得到这段代码的调试断言。我正在使用 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
class 的析构函数未声明为虚拟的,我不会得到此断言。我想知道这有什么问题?
要生成析构函数 virtual
,您需要在基 class:
struct car {
virtual ~car() {std::cout << "Destructor of car"; }
// ↑↑↑↑↑↑↑
};
没有这个,你的代码有 undefined behaviour.
要使派生的 class 析构函数成为虚拟的,您的基 class 析构函数也必须是虚拟的。
有关详细说明,请参阅
当 honda
的析构函数不是虚拟的时断言消失的原因是它变得定义明确。虽然,建议将基础 class 析构函数设置为虚拟的,以便通过继承层次结构进行析构调用。