【发布时间】:2011-05-30 05:01:17
【问题描述】:
考虑以下代码:
class A
{
public:
A() {}
~A() {}
};
class B: public A
{
B() {}
~B() {}
};
A* b = new B;
delete b; // undefined behaviour
我的理解是 C++ 标准说删除 b 是未定义的行为 - 即,任何事情都可能发生。但是,在现实世界中,我的经验是~A()总是被调用,并且内存被正确释放。
如果 B 引入任何具有自己的析构函数的类成员,它们将不会被调用,但我只对上述简单的情况感兴趣,其中使用继承可能修复一个类方法中的错误源代码不可用。
显然,在非平凡的情况下,这不会是您想要的,但至少是一致的。对于显示的代码,您是否知道任何没有发生上述情况的 C++ 实现?
【问题讨论】:
-
根据我的经验,未定义并不总是意味着不可预测。但在这种情况下,我不明白该值 - 如果您使用的是 A* 指针,则不会调用任何 B 方法,除非它们是 A 中的虚拟方法。
-
@Mark - 是的,但如果我使用 B* 指针,我认为它不再是未定义的行为?
-
正确,使用 B* 将消除此代码中所有未定义的行为。调用
~B,然后调用~A,然后释放sizeof(B)内存。 -
如果涉及多重继承,它可能会爆炸。
标签: c++ destructor undefined-behavior