c++ - 虚拟析构函数和内存释放

标签 c++ heap-memory virtual-destructor

我不太确定我是否理解虚拟析构函数和在堆上分配空间的概念。让我们看下面的例子:

class Base
{
public:
    int a;
};

class Derived : public Base
{
public:
    int b;
};

我想如果我做这样的事情

Base *o = new Derived;

在堆上分配了 8 个字节(或系统需要的任何两个整数),看起来像这样: ... |一个 |乙 | ...

现在如果我这样做:

delete o;

'delete' 如何知道实际上是哪种类型的 o 以便从堆中删除所有内容?我想它必须假设它是 Base 类型,因此只从堆中删除 a (因为它不能确定 b 是否属于对象 o): ... |乙 | ...

b 将保留在堆上并且无法访问。

执行以下操作:

Base *o = new Derived;
delete o;

真正引起内存泄漏,我需要一个虚拟析构函数吗?或者 delete 是否知道 o 实际上是 Derived 类的,而不是 Base 类的?如果是这样,它是如何工作的?

谢谢大家。 :)

最佳答案

您对实现做出了很多假设,这可能 或者可能不成立。在 delete 表达式中,动态类型必须是 与静态类型相同,除非静态类型具有虚拟 析构函数。否则,它是未定义的行为。时期。那是 真的所有你必须知道的——我用过的实现 否则它会崩溃,至少在某些情况下是这样;我用过 这样做会破坏自由空间的实现,所以 代码稍后会在完全不相关的部分崩溃 的代码。 (郑重声明,VC++ 和 g++ 都属于第二种情况,在 至少在使用发布代码的常用选项编译时。)

关于c++ - 虚拟析构函数和内存释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18047082/

相关文章:

c++ - 目前密码生成器问题将 vector 转换为字符串

c++ - 从未知派生类调用接口(interface)函数(多重继承)

c++ - "delete"是否与多态性一起正常工作?

c++ - 默认的虚拟析构函数是否会阻止编译器生成的 move 操作?

c++ - 缺少 vtable 通常意味着第一个非内联虚拟成员函数没有定义

c++ - Visual C++ 类库

C++ 参数堆与堆栈

C - 检测到堆损坏

java - Android 中的堆转储和内存使用差异?

c++ - 3.4.1 非限定名称查找