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

Dim*_*eks 4 c++ c++11 c++14

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

class Manager
{
    Member a, b;

    ~Manager()
    {
        // this code will be executed BEFORE the a and b destructors
        important_cleanup();
    }
};
Run Code Online (Sandbox Code Playgroud)

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

有解决这个问题的好方法吗?

PS我知道我可以定义某种 clenup 成员,并使其成为 的第一个创建的成员Manager,但这看起来很丑陋并且使事情依赖于顺序......

Jus*_*tin 6

假设您还发表了评论,指出成员顺序对特定成员很重要,那么依靠销毁顺序确实不容易出错。它被放入语言中是有原因的,所以使用它完全没问题。

也就是说,如果您对依赖它感到不舒服,则会在基类的析构函数之前调用成员的析构函数,因此您可以使用基类来执行此操作:

class ManagerCleanup {
public:
    ~ManagerCleanup() {
        important_cleanup();
    }

private:
    some_native_resource resource;
};

// Might as well inherit privately
class Manager : private ManagerCleanup
{
    Member a, b;
};
Run Code Online (Sandbox Code Playgroud)

请注意,如果包装资源,则更惯用:

// 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;
};
Run Code Online (Sandbox Code Playgroud)