检查从enable_shared_from_this派生的对象是否由shared_ptr管理?

时间:2018-12-18 16:14:04

标签: c++ c++11 c++17 shared-ptr

假设我有一个从std::enable_shared_from_this派生的类

struct foo
  : std::enable_shared_from_this<foo>
{
    std::shared_ptr<foo> get_shared()
    {
        return shared_from_this();
    }

    bool is_shared() const
    {
        /* implementation ??? */
    }
};

foo  A;
auto S= A.get_shared();   // UB (pre c++17) or exception (c++17)

在c ++ 17之前,似乎没有办法检测对象foo是否实际上由shared_ptr管理。是吗?

但是即使对于c ++ 17,我也不确定如何最好地实现这种检测。一种明显的方法是

bool foo::is_shared() const
{
    try {
        shared_from_this();
    } catch(...) { 
        return false;
    }
    return true;
}

但是可以避免使用try-catch吗?我可以使用weak_from_this()吗?怎么样?

1 个答案:

答案 0 :(得分:6)

您可以在C ++ 17中利用is_shared来实现weak_from_this(),例如:

bool is_shared() const
{
    return !weak_from_this().expired();
}

这是无异常的,并且只会返回true,因为该对象实际上是由shared_ptr管理的。

在C ++ 17之前的版本中,没有方法进行检查,因为当对象不是shared_from_this()所拥有时,调用shared_ptr是一种不确定的行为。直到在C ++ 17中引入weak_from_this()以后,我们才能(通过副本)访问weak_ptr的私有std::enable_shared_from_this成员,我们才能以定义的方式检查状态