关于enable_shared_from_this的困惑

时间:2016-03-08 14:41:57

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

我需要帮助来理解enable_shared_from_this。我对enable_shared_from_this的使用感到有点困惑。 为了正确使用,我们考虑从http://en.cppreference.com/w/cpp/memory/enable_shared_from_this

复制一个示例
#include <memory>
#include <iostream>

struct Good: std::enable_shared_from_this<Good>
{
    std::shared_ptr<Good> getptr() {
        return shared_from_this();
    }
};

struct Bad
{
    std::shared_ptr<Bad> getptr() {
        return std::shared_ptr<Bad>(this);
    }
    ~Bad() { std::cout << "Bad::~Bad() called\n"; }
};

int main()
{
    // Good: the two shared_ptr's share the same object
    std::shared_ptr<Good> gp1(new Good);
    std::shared_ptr<Good> gp2 = gp1->getptr();
    std::cout << "gp2.use_count() = " << gp2.use_count() << '\n';

    // Bad, each shared_ptr thinks it's the only owner of the object
    std::shared_ptr<Bad> bp1(new Bad);
    std::shared_ptr<Bad> bp2 = bp1->getptr();
    std::cout << "bp2.use_count() = " << bp2.use_count() << '\n';
} // UB: double-delete of Bad

在上面的例子中

  • 我们从getptr()致电gp1 shared_ptr
std::shared_ptr<Good> gp2 = gp1->getptr();
  • 如果我们这样做,我认为我们可以实现同样的目标
std::shared_ptr<Good> gp2 = gp1;
  • 我发现有限制,我们不能从a调用getptr() 正常的对象。它必须是shared_ptr。

例如:

 Good gp; gp.getptr(); // throws std::bad_weak_ptr 
 Good *gp1 = new Good(); gp1->getptr();// throws std::bad_weak_ptr

我的疑问是,当我们已经shared_ptr时,我们也可以直接分配到另一个shared_ptr。比如std::shared_ptr<Good> gp2 = gp1;

那么enable_shared_from_this需要什么?

1 个答案:

答案 0 :(得分:0)

shared_from_this()的一个更常见的用法是为被调用的函数提供调用类的shared_ptr。因此,如果您需要为某个函数提供shared_ptr实例,并且您确定要调用的类存储为shared_ptr,那么您可以使用shared_from_this()。基于您引用的伪代码示例:

struct Good: std::enable_shared_from_this<Good>
{
    std::shared_ptr<Good> call_function() {
        Foo foo;
        foo.use_my_shared_ptr(shared_from_this());
    }
};

Foo这里只是一个需要shared_ptr到Good的类。