问题标签 [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 投票
3 回答
371 浏览

c++ - 虚拟析构函数签名

对于虚拟机制,我们需要在基类和派生类中具有相同的方法名称。然而,在虚拟析构函数的情况下,名称可以不同。

任何人都可以解释虚拟机制(V-Ptr,V-Table)如何支持/使用不同命名的析构函数。

0 投票
3 回答
2469 浏览

c++ - 当派生类的析构函数是非虚拟的时,为什么在派生对象上调用基类析构函数?

为什么在下面的示例中调用了所有析构函数 , , ~D()~C()~B()~A()

只有一个虚拟析构函数: of A

这是代码:

0 投票
3 回答
1613 浏览

qt - QMainWindow 析构函数

为什么 QMainWindow 的析构函数不是虚拟的?如果我从 QMainWindow 继承一个类 MainWindow 并在其上有一些指针属性,我无法使用 MainWindow 的析构函数删除内存。

0 投票
1 回答
726 浏览

c++ - 调用抽象类的析构函数

我有三个班。

Father是抽象的,也是GrandfatherSon不是抽象的。

如果我这样做:

然后这样做:

如何确保调用Fatherand的析构函数Grandfather

0 投票
3 回答
310 浏览

c++ - 需要确保构造函数/析构函数被调用一次。但是“错误:析构函数是私有的”

我有以下代码

根据许多建议,析构函数是私有的,只能在程序结束时调用一次。
但我有编译器错误:

当然,我可以公开构造函数和/或析构函数,并且没有任何类似的错误。但我需要确保它们都被调用一次且仅调用一次。
如何?

0 投票
1 回答
439 浏览

c++ - 如何在 Xcode 中导出虚拟析构函数?

我正在开发一个包含两个模块的示例项目:A 和 B(链接到 A),使用 Xcode 4.4。

在模块 A 中,符号被编译器标志 -fvisibility=hidden 隐藏。我有一个类,其析构函数是虚拟的并导出:

它被实现为:

在模块 B 中,MyUtx 从 utx 派生如下:

虽然,我总是得到以下模块 B 的链接错误:

如果 utx 的析构函数是非虚拟的,问题就消失了。

0 投票
3 回答
4773 浏览

c++ - 在 C++ 中实现虚拟析构函数

我开始学习 c++,但我被困在析构函数中。我们需要实现一个向量,这就是我目前所拥有的。

给出了接口,我需要实现它。但这与 C 和 Java 有很大的不同,我有点迷茫。


在第二个练习中,我们需要使用 a) 以前的 Vector 实现作为派生类和 b) Vector 作为组合类来实现类似的东西,所以也许我们会在其中一种方法中使用虚拟析构函数?

0 投票
3 回答
212 浏览

c++ - 为什么抽象类的默认析构函数不是虚拟的?

考虑

在这一点上,它绝对A是一个抽象类,并且永远不会被自己实例化。那么为什么标准不要求自动生成的析构函数也必须是虚拟的呢?

每次我需要在我的接口类中定义一个虚拟的虚拟描述符时,我都会问自己这个问题,但我不明白为什么 commetee 不这样做。

那么问题来了:为什么抽象类中生成的析构函数不是虚拟的?

0 投票
2 回答
806 浏览

c++ - 基础和派生虚拟析构函数的效果

我对多个虚拟析构函数有了一些重新考虑,尤其是。在阅读http://blogs.msdn.com/b/oldnewthing/archive/2004/05/07/127826.aspx之后。

假设我有

在 cpp 文件中,在每个析构函数中,我正在删除相应的_logger指针

这会按我的预期工作,没有内存泄漏吗?

0 投票
2 回答
476 浏览

c++ - Keil:虚拟或受保护的析构函数和堆

我正在将 Keil 4 与 ARM 工具集一起用于 Cortex M3(如果这很重要的话)。我尝试了这个简单的代码:

如果我在本地(在 main 内部)创建 Derived 的实例,一切都很好:调试工作正常,程序大小约为 300 字节。

如果我创建 Derived 的静态或全局实例,程序大小会增加到 1000 字节,并且调试会话会在 BKPT 指令上停止。

我整理出这是因为堆大小设置为其默认值(零)。当我添加一些堆时,调试开始工作。

使析构函数受保护但非虚拟会导致相同的行为。使通常的方法 virtual 没有。

所以,我的问题是:为什么编译器在这种情况下需要堆?

Vtab 是静态创建的(我检查过),全局对象也应该是静态的。当我不需要动态分配时,再浪费 700 个字节用于堆分配代码(以及堆本身的空间)有点愚蠢。

(我将析构函数设为虚拟以防止出现警告。)