代码之家  ›  专栏  ›  技术社区  ›  Walter

检查从“启用共享”派生的对象是否由“共享”ptr管理?

  •  7
  • Walter  · 技术社区  · 7 年前

    假设我有一个类派生自 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 回复  |  直到 7 年前
        1
  •  6
  •   Arne Vogel    7 年前

    你可以实现 is_shared 杠杆作用 weak_from_this() 在C++ 17中喜欢:

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

    这是免费的,只会返回 true 对象是否由 shared_ptr .

    前C ++ 17没有检查的方法,因为它是未定义的调用行为。 shared_from_this() 当对象不属于 SelddPPTR . 直到那时 弱的,弱的 在C++ 17中介绍了我们可以访问私有 weak_ptr 成员 std::enable_shared_from_this (通过复印件)我们可以以规定的方式检查状态。