在它自己的析构函数中移动对象

Move object within its own destructor

如果我有一个最初由 AManager 拥有的只能移动 class,可以通过 obtain 转让给另一个所有者,通过 release 返回给 AManager。

class AManager;

class A {
public:
    A(const A& other) = delete;
    const A& operator=(const A&) = delete;

    A(A&& other);
    A& operator=(A&& other);

private:
    AManager& _manager;
    bool _isValid;
};

class AManager {
public:
    A obtain() {
        return std::move(_instance);
    }
    void release(A a) {
        _instance = std::move(a);
    }

private:
    A _instance;
};

A 在自己的析构函数中移动自己是否有效?即,A 在被销毁时将自己释放回其管理器是否有效?

A::~A() {
    if (_isValid) {
        _manager.release(std::move(*this));
    }
}

假设 A class 有一些方法可以知道它是否处于有效状态。例如,我添加了一个有效标志。我相信 unique_ptr 使用指针是否为 null。

is it valid for A to release itself back to its manager when it is destroyed?

什么意义上的“有效”?它会编译吗?是的

这有什么意义吗?编号

您正在移动一个正在被销毁的物体。该对象的所有者请求并期望由该对象管理的资源不再存在。通过将这些资源还给经理,它们将继续存在。

基本上,您拥有的是假装共享所有权。管理器可以假装与您共享所有权,但实际上,它 始终 拥有该对象,并且永远不会放弃这些资源的真正所有权。它就像一个 shared_ptr,只是它的使用次数永远不会超过 2。

此外,与适当的共享指针不同,如果 A 比其管理器长寿,则没有明显的保护措施。该引用将简单地引用一个被销毁的对象,当 A 实例被销毁时导致 UB。

如果您想共享所有权,则共享它。如果你不这样做,那就不要。但是这种半状态会使您的代码变得脆弱。