如何在析构函数中执行一些代码*在*成员被销毁之后

How to execute some code in destructor *after* member are destroyed

本文关键字:成员 之后 代码 析构函数 执行      更新时间:2023-10-16

我有一个"管理器"类,必须在成员被销毁进行某些清理:

class Manager
{
Member a, b;
~Manager()
{
// this code will be executed BEFORE the a and b destructors
important_cleanup();
}
};

这里的问题是important_cleanup()使我的变量ab无效,因此它们的析构函数失败。

有没有解决问题的好方法?

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;
};