问题标签 [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.
c++ - 何时以及为什么不应将基类中的析构函数定义为虚拟的?
下面的这个例子说明了如何防止派生类被复制。它基于声明了复制构造函数和复制赋值运算符的基类private
。
我们可以使用这个类,结合私有继承,使类不可复制:
请注意,类中的析构函数Uncopyable
未声明为virtual.
以前,我了解到
- 基类中的析构函数应该是
virtual
. - 不应该在非基类中使用析构函数
virtual
。
在这个例子中,析构函数Uncopyable
is not virtual
,但它被继承自。这似乎与我之前学到的智慧背道而驰。
何时以及为什么不应将基类中的析构函数定义为virtual
?
c++ - 执行“删除”时缺少虚拟析构函数
C++ FAQ Lite 的第16.15 节讨论delete this
并提到:
自然,通常的警告适用于当您没有虚拟析构函数时您的 this 指针是指向基类的指针的情况。
为什么这是真的?考虑这段代码:
如此使用:
在调用p->suicide()
中, 的析构函数MyKlass
按预期调用,即使ISuicidal
没有虚拟析构函数。
对我来说这是有道理的,因为在 中MyKlass::suicide
,静态类型this
是已知的MyKlass*
,所以调用了正确的析构函数。这很容易通过在typeid
内部调用来验证suicide
。
那么FAQ条目是不准确的,还是我误解了它?
c++ - 这个关于隐式删除的虚拟析构函数的错误消息是什么?
我刚刚在 Windows、MinGW 下将 GCC 从(我认为)4.5.6 更新到 4.6.1。突然,我的 NonInstantiable 基类(您使用 public virtual 继承以防止实例化)拒绝使用以下和类似的错误消息:
错误:
我怀疑这是因为我没有在子类中创建任何虚拟或其他析构函数,这在某种程度上与 NonInstantiable 的私有虚拟析构函数冲突,但我需要确认。以及如何修复我的 NonInstantiable 类以抑制这些错误的解决方案,但仍然有效。
c++ - 从析构函数体内部或外部的叶类调用成员函数有区别吗?
我有一个很难在代码片段中隔离的具体案例,但我可以解释一下......
我有一个类 A:public B 和 A 有一个 foo * f 类型的成员指针。在 A 的虚拟析构函数中,我有类似的东西:
其中,shutdown 是非虚拟的,类似于:void A::shutdown() {delete f;}
事实证明,在运行时,这给了我一个“称为终止的纯虚拟方法,在没有活动异常中止(核心转储)的情况下调用”,但是如果我从析构函数的主体中删除 shutdown() 并直接调用它,然后让析构函数运行......我不再明白这个......
什么可能导致这种行为?我尝试过使用 gdb,但它很大,我什至不确定要寻找什么。任何想法将不胜感激!
c++ - 在析构函数中调用 Inherited IUnknown::Release()
为什么在析构函数中对 IWICImagingFactory 对象调用继承的 IUnknown::Release() 函数会导致在对象的虚函数表 (__vfptr) 中显示“CXX0030:错误:无法评估表达式”?
这是参考我之前发布的一个问题,但我已经意识到问题只发生在析构函数中。虚函数表在我检查过的其他任何地方都有效。但是,一旦在析构函数中,所有条目都会显示 CXX0030 错误,并且尝试调用继承的 IUknown::Release() 失败。
编辑:这是一些演示代码:
问题是当我在 WICFactory 对象上调用 SafeRelease() 时,我得到:DemoApp.exe 中 0x0024e135 处的第一次机会异常:0xC0000005:访问冲突读取位置 0x6d5c28f0。DemoApp.exe 中 0x0024e135 处的未处理异常:0xC0000005:访问冲突读取位置 0x6d5c28f0。
virtual-destructor - 为什么我们在 C++ 中有一个虚拟析构函数而不是一个虚拟构造函数?
为什么我们可以有一个虚拟析构函数而不是虚拟构造函数?
c++ - 使用伪装模式时需要虚拟析构函数吗?
如果我有以下 3 个类来隐藏数据类型和存储信息,我需要虚拟析构函数吗?我被引导相信不,但现在我不确定。如果可能,出于性能原因,我宁愿不包括它。例如清酒的课程被剥离。
c++ - 传递给虚拟析构函数的这个额外参数是什么?
我有这个代码:
我用 Visual C++ 10 编译并得到这个反汇编delete object
语句:
这对于实际的析构函数:
在调用站点做什么?push 1
为什么test
在析构函数入口点检查该值并有条件地绕过对 的调用operator delete()
?
qt - 如何防止在 Qt 中的 deleteChildren() 期间删除孩子?
我有一个日志接口,允许用户继承 aLogger
并覆盖log()
虚函数,以便用户可以创建自己的记录器。有一个管理器跟踪所有已注册的日志记录方法(即控制台、系统日志、小部件等)
我创建了一个显示日志的 QListWidget Logger。不幸的是,它归日志管理器所有,因为它是一个 QObject,它也是 MainWindow 的子窗口。这导致两个对象试图在应用程序关闭时将其删除。
第一次QObjects->deleteChildren()
被调用并删除它。然后 Loggin gmanager 再次尝试并崩溃。
如何防止特定的 QObject 在 期间被破坏deleteChildren()
?这是个坏主意吗?