我不太确定我是否理解虚拟析构函数和在堆上分配空间的概念。让我们看下面的例子:
class Base
{
public:
int a;
};
class Derived : public Base
{
public:
int b;
};
我想如果我做这样的事情
Base *o = new Derived;
在堆上分配 8 个字节(或系统上需要的任何两个整数),看起来像这样:
... |一个 |乙| ...
现在如果我这样做:
delete o;
“删除”如何知道 o 实际上是哪种类型,以便从堆中删除所有内容?我想它必须假设它是 Base 类型,因此只从堆中删除 a (因为它无法确定 b 是否属于对象 o):
... |乙| ...
b 将保留在堆上并且无法访问。
执行以下操作:
Base *o = new Derived;
delete o;
确实会引起内存泄漏,我在这里需要虚拟析构函数吗?或者delete是否知道o实际上是派生类的,而不是基类的?如果是这样,它是如何运作的?
多谢你们。 :)
您对实施做出了很多假设,这可能
或者可能不成立。在一个delete
表达式,动态类型必须是
与静态类型相同,除非静态类型有虚拟
析构函数。否则,这是未定义的行为。时期。那是
真的是你所需要知道的一切——我已经使用过以下实现
否则它会崩溃,至少在某些情况下;我用过
这样做会破坏自由空间的实现,所以
代码稍后会在完全不相关的部分崩溃
的代码。 (根据记录,VC++ 和 g++ 都属于第二种情况,位于
至少在使用已发布代码的常用选项进行编译时是这样。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)