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

c++ - 何时以及为什么不应将基类中的析构函数定义为虚拟的?

下面的这个例子说明了如何防止派生类被复制。它基于声明了复制构造函数和复制赋值运算符的基类private

我们可以使用这个类,结合私有继承,使类不可复制:

请注意,类中的析构函数Uncopyable未声明为virtual.

以前,我了解到

  • 基类中的析构函数应该是virtual.
  • 不应该在非基类中使用析构函数virtual

在这个例子中,析构函数Uncopyableis not virtual,但它被继承自。这似乎与我之前学到的智慧背道而驰。

何时以及为什么不应将基类中的析构函数定义为virtual

0 投票
6 回答
1539 浏览

c++ - 执行“删除”时缺少虚拟析构函数

C++ FAQ Lite 的第16.15 节讨论delete this并提到:

自然,通常的警告适用于当您没有虚拟析构函数时您的 this 指针是指向基类的指针的情况。

为什么这是真的?考虑这段代码:

如此使用:

在调用p->suicide()中, 的析构函数MyKlass按预期调用,即使ISuicidal没有虚拟析构函数

对我来说这是有道理的,因为在 中MyKlass::suicide,静态类型this是已知的MyKlass*,所以调用了正确的析构函数。这很容易通过在typeid内部调用来验证suicide

那么FAQ条目是不准确的,还是我误解了它?

0 投票
1 回答
15930 浏览

c++ - 这个关于隐式删除的虚拟析构函数的错误消息是什么?

我刚刚在 Windows、MinGW 下将 GCC 从(我认为)4.5.6 更新到 4.6.1。突然,我的 NonInstantiable 基类(您使用 public virtual 继承以防止实例化)拒绝使用以下和类似的错误消息:

错误:

我怀疑这是因为我没有在子类中创建任何虚拟或其他析构函数,这在某种程度上与 NonInstantiable 的私有虚拟析构函数冲突,但我需要确认。以及如何修复我的 NonInstantiable 类以抑制这些错误的解决方案,但仍然有效。

0 投票
2 回答
161 浏览

c++ - 从析构函数体内部或外部的叶类调用成员函数有区别吗?

我有一个很难在代码片段中隔离的具体案例,但我可以解释一下......

我有一个类 A:public B 和 A 有一个 foo * f 类型的成员指针。在 A 的虚拟析构函数中,我有类似的东西:

其中,shutdown 是非虚拟的,类似于:void A::shutdown() {delete f;}

事实证明,在运行时,这给了我一个“称为终止的纯虚拟方法,在没有活动异常中止(核心转储)的情况下调用”,但是如果我从析构函数的主体中删除 shutdown() 并直接调用它,然后让析构函数运行......我不再明白这个......

什么可能导致这种行为?我尝试过使用 gdb,但它很大,我什至不确定要寻找什么。任何想法将不胜感激!

0 投票
2 回答
1698 浏览

c++ - 在析构函数中调用 Inherited IUnknown::Release()

为什么在析构函数中对 IWICImagingFactory 对象调用继承的 IUnknown::Release() 函数会导致在对象的虚函数表 (__vfptr) 中显示“CXX0030:错误:无法评估表达式”?

这是参考我之前发布的一个问题,但我已经意识到问题只发生在析构函数中。虚函数表在我检查过的其他任何地方都有效。但是,一旦在析构函数中,所有条目都会显示 CXX0030 错误,并且尝试调用继承的 IUknown::Release() 失败。

编辑:这是一些演示代码:

问题是当我在 WICFactory 对象上调用 SafeRelease() 时,我得到:DemoApp.exe 中 0x0024e135 处的第一次机会异常:0xC0000005:访问冲突读取位置 0x6d5c28f0。DemoApp.exe 中 0x0024e135 处的未处理异常:0xC0000005:访问冲突读取位置 0x6d5c28f0。

0 投票
1 回答
1641 浏览

virtual-destructor - 为什么我们在 C++ 中有一个虚拟析构函数而不是一个虚拟构造函数?

为什么我们可以有一个虚拟析构函数而不是虚拟构造函数?

0 投票
1 回答
689 浏览

c++ - 虚拟析构函数使用数组失败

我在一个网站上找到了这段代码

为什么会崩溃

0 投票
1 回答
161 浏览

c++ - 使用伪装模式时需要虚拟析构函数吗?

如果我有以下 3 个类来隐藏数据类型和存储信息,我需要虚拟析构函数吗?我被引导相信不,但现在我不确定。如果可能,出于性能原因,我宁愿不包括它。例如清酒的课程被剥离。

0 投票
3 回答
891 浏览

c++ - 传递给虚拟析构函数的这个额外参数是什么?

我有这个代码:

我用 Visual C++ 10 编译并得到这个反汇编delete object语句:

这对于实际的析构函数:

在调用站点做什么?push 1为什么test在析构函数入口点检查该值并有条件地绕过对 的调用operator delete()

0 投票
1 回答
1944 浏览

qt - 如何防止在 Qt 中的 deleteChildren() 期间删除孩子?

我有一个日志接口,允许用户继承 aLogger并覆盖log()虚函数,以便用户可以创建自己的记录器。有一个管理器跟踪所有已注册的日志记录方法(即控制台、系统日志、小部件等)

我创建了一个显示日志的 QListWidget Logger。不幸的是,它归日志管理器所有,因为它是一个 QObject,它也是 MainWindow 的子窗口。这导致两个对象试图在应用程序关闭时将其删除。

第一次QObjects->deleteChildren()被调用并删除它。然后 Loggin gmanager 再次尝试并崩溃。

如何防止特定的 QObject 在 期间被破坏deleteChildren()?这是个坏主意吗?