如何确保父实例成员的销毁
How do I ensure the destruction of a parent instance member?
考虑C++11中的这两个类:
class A
{
ArbitraryClass someInstance;
};
class B : public A
{
};
并考虑我这样使用B
:
B *foo = new B;
delete foo;
据我了解,这里不会调用A
的隐式析构函数。
在这种情况下,someInstance
是否仍然被摧毁,因为它成为B
成员的"关联"?还是需要在A
上声明虚拟析构函数以自动触发成员的销毁?
如果delete
表达式的静态已知类(在您的例子中B
)中需要一个虚拟析构函数,如果该类与对象的最派生类不同(在您的例子中也是B
)。在你的例子中,这些类是相同的,所以你不需要虚拟析构函数:一切都被正确地销毁了。但是,如果您已将指针类型设为A*
,那么您将需要A
中的虚拟析构函数来避免未定义行为(鼻守护程序等)。
我如何确保...
主要是什么都不做。
据我了解,这里不会调用 A 的隐式析构函数。
错。
在这种情况下,
someInstance
仍然被摧毁吗
是的。
因为它成为 B 的成员"关联"?
因为它是A的成员,而A被销毁了。
还是我需要在 A 上声明一个虚拟析构函数来自动触发成员的销毁?
不是在您发布的代码的情况下,但如果(很可能)您将通过删除指向 A 的指针(可能是 B 或 A 的其他子类)来使用多态性,您应该为 A 提供一个虚拟析构函数。
相关文章:
- 静态数据成员模板专用化的实例化点在哪里
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- C++初始化类实例时隐式调用类成员的构造函数
- 受约束的成员函数和显式模板实例化
- 为什么静态数组成员变量在调用对象的实例后不显示任何内容?
- 访问同级类实例的成员
- static_assert私有类成员的类型,没有实例
- "new"创建的实例的所有成员变量是否都存在于堆上而不是堆栈上?
- 实例化多种类型的成员函数模板
- 清除具有已删除赋值运算符的成员的类实例
- 依赖于类成员属性的类实例成员
- 力模板静态成员实例
- C 中的成员实例如何构建
- 使用向量<向量>成员实例化对象时的隔离错误<int>
- 具有静态成员实例的单一实例
- 一个类不能有自己的静态 constexpr 成员实例吗?
- 静态成员与静态常量成员实例化 - 有什么区别?
- 使用静态成员实例的 C++ 中的线程安全单一实例(无延迟实例化)
- 显式类成员实例化
- 带有自身静态const成员实例的c++模板类