|
1
13
考虑以下情况:
您需要虚拟析构函数,否则当您删除
|
|
|
2
7
如果通过C++中的基类指针删除派生类对象,则结果是未定义的行为。UB是您真正想要避免的,所以必须给基类一个虚拟析构函数。引用C++标准,第5.3.5节:
|
|
|
3
3
如果希望人们尝试通过父类的指针或引用删除派生类的对象,则应使用虚拟析构函数。如果是这种情况,那么如果没有虚拟析构函数,派生类将永远不会被正确地销毁。 例如,
如果在基中没有虚拟析构函数,派生的析构函数将永远不会被调用,因此重要的事情将永远不会发生。 |
|
|
4
3
主要回复编辑: 没有人能告诉你会发生什么,因为结果是“未定义的行为”。当您通过指向没有虚拟析构函数的基的指针删除派生类时,实现可以以任意方式分解。 |
|
|
5
2
通常,析构函数应该是 (1) 公共和虚拟,或 (2) 受保护和非虚拟。 假设您从未期望任何人通过接口指针删除类实例,那么受保护的非虚拟析构函数是100%安全的。 如果有人试图删除案例(2)中的接口指针,他们将得到一个编译时错误。 |
|
|
6
0
不。。。虚拟析构函数不是自动生成的。必须在基类中明确地声明它们。 但是您不需要为基的子类声明析构函数为虚拟的。这是由编译器完成的。 编译器还将确保按照构造的相反顺序(从派生到基)调用析构函数。
如果没有虚拟析构函数
会导致内存泄漏(整数字段至少4个字节),因为它只会破坏
|
|
AstralHex · 矩阵乘法代码工作不正常 10 月前 |
|
|
Giogre · 为包含许多数值字段的简单“struct”重载比较运算符 11 月前 |
|
|
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 11 月前 |
|
|
Die4Toast · 递归调用成员箭头运算符-> 11 月前 |
|
|
Anka Hanım · 关于结构和动态数组地址的问题 11 月前 |