如何在析构函数中执行一些代码*在*成员被销毁之后
How to execute some code in destructor *after* member are destroyed
我有一个"管理器"类,必须在成员被销毁后进行某些清理:
class Manager
{
Member a, b;
~Manager()
{
// this code will be executed BEFORE the a and b destructors
important_cleanup();
}
};
这里的问题是important_cleanup()
使我的变量a
和b
无效,因此它们的析构函数失败。
有没有解决问题的好方法?
PS我知道我可以定义某种 clenup 成员,并使其成为Manager
的第一个创建成员,但这看起来很丑陋,并且使事情依赖于顺序......
依赖销毁顺序确实不容易出错,假设您还放置了一条注释,说明成员顺序对特定成员很重要。它放在语言中是有原因的,所以使用它完全没问题。
也就是说,如果您不习惯依赖它,则会在基类的析构函数之前调用成员的析构函数,因此您可以使用基类来执行此操作:
class ManagerCleanup {
public:
~ManagerCleanup() {
important_cleanup();
}
private:
some_native_resource resource;
};
// Might as well inherit privately
class Manager : private ManagerCleanup
{
Member a, b;
};
请注意,如果您包装资源,它会更惯用:
// Note: this could probably be a std::unique_ptr. std::unique_ptr can
// manage arbitrary resources, not just pointers.
class ItemRequiringCleanup {
public:
// Ensure you implement/disable copy/move operations appropriately
~ItemRequiringCleanup() {
important_cleanup();
}
private:
some_native_resource resource;
};
class ManagerCleanup {
private: // or protected:
ItemRequiringCleanup resource;
};
// Might as well inherit privately
class Manager : private ManagerCleanup
{
Member a, b;
};
相关文章:
- 类的前向声明之后的类成员函数定义,在类声明之前
- 在成员构造函数之后调用基类构造函数
- 在实例化封闭类模板之后,我们可以声明模板类成员的部分专用化吗
- 在析构函数之后,围绕成员函数的C++lambda包装器是如何工作的
- 使用 std::function 作为成员函数,它捕获"this",并在析构函数之后从复制的 lam
- 如何在析构函数中执行一些代码*在*成员被销毁之后
- 类成员在构造函数(线程)之后更改地址
- 如何使派生的类成员对齐,以使第一个成员立即出现在基类的最后一个成员之后
- 成员对象的地址在构造函数之后立即更改
- C 成员变量损失构造子之后的值
- 在 Sprite::create() 之后悬空 Sprite 指针成员变量
- 在std::move()之后删除堆上结构的成员
- 对对象的数据成员的shared_ptr是否使数据成员在对象的生存期之后保持活动状态
- 函数对象在for_each之后丢失了数据成员的值
- 在定义成员类之后重新声明它是否合法?
- 在虚拟分派之后调用基成员(模拟类似虚拟析构函数的分派)
- 在相同类型的数组成员之后对齐
- c++之前/之后的constexpr静态成员
- 为什么我的数据成员即使在构造之后也是空的
- 为什么重写出现在成员声明之后,而不是与virtual相同的位置