为什么非虚拟析构函数没有内存泄漏
我被告知B->b在以下代码中没有内存泄漏:
struct A {}; // no virtual destructor
struct B : public A {
int b;
}
int main() {
A* a = new B {};
delete a;
}
如果是真的,你能解释一下为什么吗?
回答
因为这就是未定义行为的工作原理。内存不能保证泄漏。但也不能保证不泄漏。就语言而言,任何行为都是可能的。
为什么这是未定义行为
因为非虚拟析构函数是通过动态类型为另一种(派生)类型的指针调用的。
是否可以具体说一下 B::b 的生命周期
好吧,它是 的成员B,因此它与任何B对象具有相同的生命周期。至于动态B对象的生命周期,由于UB,我们不能说太多。