关于c ++:整个对象是用非虚析构函数和Base类指针释放的吗?

Is the whole object freed with a non-virtual destructor and a Base class pointer?

(P)如果一个基本类别没有一个虚拟驱逐舰(在命令进入时)和产地阶级只不过是基本的吸引因素,那么所有的备忘录都是新的,而基层阶级的观点是被授权的?I know the destructor of the derived class will not be called but I am wondering if the memory allocated by the whole object will be freed?I assume also that calling delete on a derived point will free the whole memory space.(p)(P)此外,如果它不能免除备忘录中的派生阶级,那么它是如何在同样的情况下工作的,但与基地阶级中的一个虚拟毁灭者,知道有多少备忘录可以免除?(p)(P)Exmple:(p)字母名称


这是未定义的行为,所以任何事情都可能发生。引用自标准[expr.delete]:

In the first alternative (delete object), if the static type of the object
to be deleted is different from its
dynamic type, the static type shall be
a base class of the dynamic type of
the object to be deleted and the
static type shall have a virtual
destructor or the behavior is
undefined.

尽管它的工作方式是实现的细节,但典型的实现可以自动重写派生类中的析构函数,并在那里实现内存的释放。请注意,必须在基类中定义虚拟析构函数,以便实现可以在虚拟表中保留一个条目。


从技术上讲,答案是"未知"。删除从没有虚拟析构函数的指向基的指针派生的指针是未定义的行为。

但实际上,大多数实现都无法正确地删除派生对象中的内容。


从形式上讲,这是未定义的行为,因此您不能保证内存被释放,或者确实是您的程序做了任何特别的事情。它可以格式化您的硬盘。也许不会。在实践中,在这种情况下,记忆可能会被释放——但是如果你依赖它,那你就是愚蠢的,你不应该这样做。就这么简单。


内存很有可能被正确释放。仅仅因为标准不能保证这一点,并不意味着它不会起作用。很难看出它是如何失败的。


编辑:我错了:标准草案中的关键文章,强调我的:第5.3.5节

3 In the first alternative (delete
object), if the static type of the
object to be deleted is different from
its dynamic type, the static type
shall be a base class of the dynamic
type of the object to be deleted and
the static type shall have a virtual
destructor or the behavior is
undefined. In the second alternative
(delete array) if the dynamic type of
the object to be deleted differs from
its static type, the behavior is
undefined.


在您描述的非常特殊的情况下,当您没有虚拟析构函数时,派生类对象使用的所有内存都将被释放。(如果使用非虚拟析构函数总是导致派生类泄漏内存,我认为该语言不允许从使用它们的类继承!)

记住,析构函数不是释放内存的工具;"删除"是释放内存的工具。析构函数只是一个被delete调用的函数。

布拉布拉布拉扩展性布拉布拉在将来会给自己带来麻烦布拉布拉小心等。很明显,你知道我的意思。