Is the whole object freed with a non-virtual destructor and a Base class pointer?
这是未定义的行为,所以任何事情都可能发生。引用自标准[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调用的函数。
布拉布拉布拉扩展性布拉布拉在将来会给自己带来麻烦布拉布拉小心等。很明显,你知道我的意思。