问题标签 [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 回答
135 浏览

c++ - Deleting an object polymorphically

I know that if Base class has a non-virtual destructor, only ~Base() destructor is going to be called when deleting optr pointer. But I found out that even without ~Derived() destructor being called the memory that was taken by the Derived Object was freed. So my question is can an object get freed without calling it's destructor?

If the answer is yes, can I use a non-virtual destructor if my Derived class does not contain any dynamically allocated variables so I don't care if it did not get called?

0 投票
4 回答
3886 浏览

c++ - 如果基类析构函数是虚拟的,是否需要派生类析构函数定义?

我正在尝试以下示例:

Q.1) 为什么不调用派生类的析构函数,就像我正在执行的基类析构函数一样values.clear()

Q.2) 如果基类析构函数是虚拟的,是否需要派生类析构函数定义?

0 投票
2 回答
534 浏览

c++ - 为什么这不是内存泄漏?或者是吗?删除没有虚拟析构函数的基类指针

当我注意到不应该发生的事情时,我一直在插手,使用 Intel Inspector 测试内存泄漏。我从不应具有虚拟析构函数的 std::vector 继承,派生类中有一个额外的成员,我对其进行动态内存分配,在 main 中我在堆上创建派生类,强制转换为基类,调用delete...并没有检测到内存泄漏???按照所有逻辑,我应该得到内存泄漏。

0 投票
4 回答
16036 浏览

c++ - C++:从 std::map 继承

我想继承自std::map,但据我所知std::map没有任何虚拟析构函数。

因此,是否可以std::map在我的析构函数中显式调用 ' 析构函数以确保正确销毁对象?

0 投票
4 回答
2232 浏览

c++ - 4 级继承链中的 C++ 虚拟析构函数。

我正在用虚拟析构函数做一个小实验来回顾 - 想知道是否有人对以下内容有简单的解释(使用 vs 2010):

I 定义类层次ABCD,D继承C,C继承B,B继承A,A是Base;

进行了 2 个实验:

第一个实验——

A 有一个虚拟的析构函数。

B 有一个非虚拟析构函数

C 有一个虚拟的析构函数

D 有一个非虚拟析构函数

//----------------------------

在 D 类型的堆上分配 4 个对象 - 将 A*、B* 和 C* 的指针指向前 3 个 - 将第 4 个对象保留为 D* 以保证完整性。删除所有 4 个指针。

正如我所料,在所有 4 个实例中,完整的析构函数链以从 D 到 A 的相反顺序执行,释放所有内存。

第二次实验——

A 有一个非虚拟析构函数 ** 将 A 更改为非虚拟

B 有一个非虚拟析构函数

C 有一个虚拟的析构函数

D 有一个非虚拟的析构函数

在 D 类型的堆上分配 4 个对象 - 将 A*、B* 和 C* 的指针指向前 3 个 - 将第 4 个对象保留为 D* 以保证完整性。

删除 C* 和 D* 指针:从 D 到 A 以相反的顺序执行完整的析构函数链,释放所有内存。

删除 B*: B 然后运行 ​​A 析构函数(泄漏)

删除 A*:仅运行一个析构函数(泄漏)

谁能解释这是为什么?

当在实验 2 中分配 D 类型对象时,它的直接基类 (C) 有一个虚拟析构函数——这不是告诉编译器用 Vptr 跟踪它并知道内存类型吗?不管参考?

谢谢迈克

0 投票
4 回答
1956 浏览

c++ - 基类析构函数不是虚拟的,子类析构函数是虚拟的,程序崩溃

为什么以下程序会崩溃?我有一个基类,其析构函数不是虚拟的,但子类析构函数是虚拟的:

0 投票
1 回答
216 浏览

c++ - 虚拟析构函数 - 谁调用底层 free()?

我试图弄清楚使用虚拟析构函数从模块 B 中删除在模块 A 中创建的对象是否安全。

使用 MS C++ 编译器时,删除具有虚拟析构函数的对象只会导致单个 vtable 调用,并且在其中free()执行底层调用(即在创建对象的同一模块中,即安全)。

问题是:它只是当前的 MS 实现,还是在某些标准或文档中得到保证并且可以安全地依赖?

这是 VS2010 中反汇编的虚拟析构函数调用的示例:

0 投票
3 回答
129 浏览

c++ - 通过基类列表调用派生类对象的析构函数

我得到了这个类来获取所有派生对象的列表

和派生类

现在我想删除整个结构,只需删除列表和其中的对象..

我试过了

但对象仍被实例化

我没主意了^^

亲切地..

0 投票
1 回答
139 浏览

c++ - C++ 虚拟析构函数和符号引用错误

只是因为我想在我的父类和子类中使用虚拟方法来应用多态性,所以我放入了虚拟析构函数。但是我确实,不断收到错误

孩子:: 〜孩子()

Child:: Child() 作为符号引用错误。

0 投票
6 回答
2055 浏览

c++ - 虚拟析构函数:如果基类动态分配内存,基类是否需要?

这个问题看起来像Virtual destructor 中的讨论:不动态分配内存时是否需要?

在一个考试问题中,有人问我: - 维护指向动态分配内存的指针的任何基类应该定义什么?

我回答: - 一个复制构造函数和一个赋值运算符(以确保不仅复制指针...... cf deep copy)和一个析构函数(释放分配的内存)

他们说这是不正确的,因为这个基类还应该定义一个虚拟析构函数而不是普通的析构函数。为什么?