在它自己的析构函数中移动对象
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。
如果您想共享所有权,则共享它。如果你不这样做,那就不要。但是这种半状态会使您的代码变得脆弱。
如果我有一个最初由 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。
如果您想共享所有权,则共享它。如果你不这样做,那就不要。但是这种半状态会使您的代码变得脆弱。