【发布时间】:2015-08-22 10:55:26
【问题描述】:
这个问题不同于“我何时/为什么应该使用virtual 析构函数?”。
struct B {
virtual void foo ();
~B() {} // <--- not virtual
};
struct D : B {
virtual void foo ();
~D() {}
};
B *p = new D;
delete p; // D::~D() is not called
问题:
- 这是否可以归类为未定义的行为(我们知道
~D()不会被称为肯定)? - 如果
~D()为空怎么办。它会以任何方式影响代码吗? - 在使用
new[]/delete[]和B* p;时,~D()肯定不会 被调用,不管析构函数的virtualness。是吗 未定义的行为或明确定义的行为?
【问题讨论】:
-
我经常想问同样的问题。考虑到这三种情况,我想要一个全面的答案:(1)B 没有虚拟方法,(2)B 有一个虚拟方法,但是一个非虚拟析构函数,(3)。 B 有一个虚拟析构函数。显然,只有后者是明确定义的:stackoverflow.com/questions/2065938/virtual-destructor
标签: c++ undefined-behavior virtual-destructor