检查调用shared_from_this()是否有效的方法?

时间:2016-04-16 17:59:53

标签: c++ shared-ptr

我想使用shared_from_this()从引用传递的对象中获取std::shared_ptr。但是,我希望对可能不在共享指针中的对象具有鲁棒性,或者甚至可能不会动态分配这些对象。

在调用调用enable_shared_from_this的潜在未定义行为之前,有没有办法检查给定对象(继承自shared_from_this()并通过引用传递)是否由共享指针管理?

2 个答案:

答案 0 :(得分:2)

您可以实现自己的make_sharedshared_from_thisenable_shared_from_this,它们具有您想要的任何语义。实现您要求的语义并不困难:

  1. 该类应该为其模板化的类的实例保留weak_ptr

  2. make_shared实现应该首先从它创建的shared_ptr初始化弱指针。

  3. shared_from_this应尝试锁定弱指针,如果失败则返回空shared_ptr

  4. 或者,如果您的平台上有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管理,则可能表明您的设计存在问题。