问题标签 [virtual-destructor]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
536 浏览

c++ - 在一行中声明和实现纯虚拟析构函数?

我正在制作一个纯虚拟析构函数来强制一个类是抽象的,除了 ctor 之外不包含任何方法。我将其作为仅标头实现

有没有像(非法的)virtual ~abstractSchema(){} = 0;这样的语法糖可以让我在一行上声明和定义,而不是像上面的例子那样拆分定义和实现?

0 投票
2 回答
3592 浏览

c++ - 基类的虚拟析构函数 c++

我对虚拟析构函数感到困惑。我已经阅读了很多问题和解释,但我仍然不明白如果基类有派生类,我是否需要实现自己的析构函数,即使它没有任何特殊操作。

编译器编译下面的代码,但会不会有内存泄漏或任何问题?

0 投票
2 回答
3355 浏览

c++ - “删除”是否适用于多态性?

我知道第二行将调用基类的析构函数,如果它没有虚拟析构函数,如果有,则调用派生类的析构函数,但会delete正确释放内存(假设BaseClass对象占用 8 个字节的空间和DerivedClass的一个 12 - 它会释放 8 或 12 个字节)并在任何一种情况下摆脱对象?

0 投票
2 回答
262 浏览

c++ - 在虚拟析构函数的情况下虚拟机制如何工作

如何获取析构函数的成员函数指针?

这里有人回答说我们无法获得析构函数的函数指针, 那么虚拟机制在下面的代码中是如何工作的。虚拟构造函数是否保存在虚拟表中?如果不是,那么在虚拟析构函数的情况下虚拟机制如何工作?

在这段代码中,如果我们在基类 Destructor 中不使用 virtual,则不会调用派生类的析构函数。

0 投票
3 回答
755 浏览

c++ - CRT 虚拟析构函数

我今天遇到了由我的 dll 和我的实际项目中的不同 CRT 设置 (MTd MDd) 引起的堆损坏。我发现奇怪的是,只有当我将 dll 中的析构函数设置为虚拟时,应用程序才会崩溃。有一个简单的解释吗?我知道我无法释放不在我的堆上的内存,但是当我将析构函数定义为非虚拟时,区别到底在哪里。

一些代码只是为了让它更清楚一点

动态链接库

还有我的项目

0 投票
1 回答
302 浏览

c++ - 多态放置的东西的析构函数

如果对象是使用新放置创建的多态类型,有没有办法在对象上调用析构函数?

我只想通过指向其虚拟基础的指针来破坏“实施”……这可能吗?

0 投票
2 回答
46174 浏览

c++ - 在 C++11 中的析构函数之后覆盖标识符

虚拟析构函数声明后的覆盖标识符有什么特殊含义吗?

在虚拟方法上使用覆盖标识符作为检查很有用:当 Base 虚拟方法实际上没有被覆盖时,编译器将报告错误。

覆盖虚拟析构函数是否也有任何意义/功能?

0 投票
3 回答
926 浏览

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

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

我想如果我做这样的事情

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

现在,如果我这样做:

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

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

执行以下操作:

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

多谢你们。:)

0 投票
1 回答
198 浏览

c++ - 向 C++ 对象模型添加元类级别

有人可以解释这个关于 C++ 对象模型的理论问题吗?这是我最近的一次考试,我被它难住了。

问:C++ 标准委员会注意到 Java、C# 和 Smalltalk 的成功,决定在语言的对象模型中增加一个额外的级别。也就是说,每个类都应该有一个在运行时具有表示的元类。

  1. 反对者说,这与该语言的一项基本原则相矛盾。哪个?解释。

  2. 反对者还声称 C++ 有一个额外的“半级”,它允许完整元类级别的一些功能。这是什么“半级”,什么样的门类享受它的能力?

  3. 支持者提出了一个成功的论点。添加一个级别将为标记和清除垃圾收集中的标记阶段提供支持(其中首先标记所有可访问的对象,然后释放不可访问的对象)。他们的论点依赖于附加层次中的什么特征?

  4. 此外,支持者还提出了另一种说法。即使没有垃圾收集系统,附加级别也会使虚拟析构函数变得多余。解释何时以及为什么需要虚拟析构函数以及额外的级别将如何消除该要求?

0 投票
1 回答
575 浏览

c++ - 虚拟析构函数:不工作?

我正在使用 GNU 编译器。B 类中的虚拟析构函数不调用析构函数 ~D()。谁能告诉我为什么?

Delete 应该调用 B 类中的虚拟析构函数,但它没有。