为什么非虚拟析构函数没有内存泄漏

我被告知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,我们不能说太多。


以上是为什么非虚拟析构函数没有内存泄漏的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>