检查调用 shared_from_this() 是否有效的方法?
Way to check if calling shared_from_this() is valid?
我想使用 shared_from_this()
从通过引用传递的对象中获取 std::shared_ptr
。但是,我希望对可能不在共享指针中或者甚至可能不会动态分配的对象保持健壮性。
有没有办法在调用 shared_from_this()
的潜在未定义行为之前检查给定对象(继承自 enable_shared_from_this
并通过引用传递)是否由共享指针管理?
构造函数通常隐藏在工厂方法后面,无法直接创建对象。
这绝对可以解决问题。这是一个最小的例子:
#include <memory>
struct S: public std::enable_shared_from_this<S> {
static std::shared_ptr<S> create() {
return std::shared_ptr<S>{new S};
}
private:
S() { }
};
int main() {
auto ptr = S::create();
}
正如评论中指出的那样,如果您需要知道 class 是否由 shared_ptr
管理,则可能表明您的设计存在问题。
您可以实现自己的 make_shared
、shared_from_this
和 enable_shared_from_this
,它们具有您想要的任何语义。实现你要求的语义并不难:
class 应该持有一个 weak_ptr
到它模板化的 class 的实例。
make_shared
实现应该从它首先创建的 shared_ptr
初始化弱指针。
shared_from_this
应该尝试锁定弱指针,如果失败,return 一个空 shared_ptr
。
或者,如果 weak_from_this
在您的平台上可用(这是一个 C++17 功能),您可以直接使用它。
但是,正如其他人所说,似乎很难相信这真的是解决您遇到的任何问题的最佳方法。您需要 shared_from_this
工作的情况必须与 shared_from_this
工作的情况完全一致。很难想象这样的用例。
我想使用 shared_from_this()
从通过引用传递的对象中获取 std::shared_ptr
。但是,我希望对可能不在共享指针中或者甚至可能不会动态分配的对象保持健壮性。
有没有办法在调用 shared_from_this()
的潜在未定义行为之前检查给定对象(继承自 enable_shared_from_this
并通过引用传递)是否由共享指针管理?
构造函数通常隐藏在工厂方法后面,无法直接创建对象。
这绝对可以解决问题。这是一个最小的例子:
#include <memory>
struct S: public std::enable_shared_from_this<S> {
static std::shared_ptr<S> create() {
return std::shared_ptr<S>{new S};
}
private:
S() { }
};
int main() {
auto ptr = S::create();
}
正如评论中指出的那样,如果您需要知道 class 是否由 shared_ptr
管理,则可能表明您的设计存在问题。
您可以实现自己的 make_shared
、shared_from_this
和 enable_shared_from_this
,它们具有您想要的任何语义。实现你要求的语义并不难:
class 应该持有一个
weak_ptr
到它模板化的 class 的实例。make_shared
实现应该从它首先创建的shared_ptr
初始化弱指针。shared_from_this
应该尝试锁定弱指针,如果失败,return 一个空shared_ptr
。
或者,如果 weak_from_this
在您的平台上可用(这是一个 C++17 功能),您可以直接使用它。
但是,正如其他人所说,似乎很难相信这真的是解决您遇到的任何问题的最佳方法。您需要 shared_from_this
工作的情况必须与 shared_from_this
工作的情况完全一致。很难想象这样的用例。