我想使用shared_from_this()
从引用传递的对象中获取std::shared_ptr
。但是,我希望对可能不在共享指针中的对象具有鲁棒性,或者甚至可能不会动态分配这些对象。
在调用调用enable_shared_from_this
的潜在未定义行为之前,有没有办法检查给定对象(继承自shared_from_this()
并通过引用传递)是否由共享指针管理?
答案 0 :(得分:2)
您可以实现自己的make_shared
,shared_from_this
和enable_shared_from_this
,它们具有您想要的任何语义。实现您要求的语义并不困难:
该类应该为其模板化的类的实例保留weak_ptr
。
make_shared
实现应该首先从它创建的shared_ptr
初始化弱指针。
shared_from_this
应尝试锁定弱指针,如果失败则返回空shared_ptr
。
或者,如果您的平台上有weak_from_this
(这是C ++ 17功能),您可以使用它。
但是,正如其他人所说,似乎很难相信这对你遇到的任何问题都是最好的解决方案。您需要shared_from_this
工作的情况必须与shared_from_this
将起作用的情况完美一致。很难想象一个用例就是这种情况。
答案 1 :(得分:0)
通常,构造函数隐藏在工厂方法之后,因此您无法直接创建对象 这绝对解决了这个问题。这是一个最小的例子:
#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();
}
正如评论中所指出的,如果您需要知道某个班级是否由shared_ptr
管理,则可能表明您的设计存在问题。