0

如果我想为 A 类返回一个 shared_ptr,我应该使用 shared_from_this() 功能。但是我认为在我已经为 A 定义了 shared_ptr 之后这将起作用。因此,如果另一个地方想要一个 shared_ptr,我只需使用我制作的那个。我想知道何时使用 shared_from_this()。

示例代码:

class A : public enable_shared_from_this<A> {
public:
    int a = 0;
    shared_ptr<A> get_this() {
        return shared_from_this();
    }
};

int main() {
    shared_ptr<A> ptr_a(new A);
    cout << ptr_a.use_count() << endl;
    shared_ptr<A> ptr_b = ptr_a->get_this(); 
    // if somewhere else wants a ptr I just use, shared_ptr<A> ptr_b = ptr_a; after pass it 
    // into a function, what situation should i use shared_from_this() for instead ???
    cout << ptr_a.use_count() << endl;
    cout << ptr_b.use_count() << endl;
}
4

1 回答 1

2

shared_ptr您似乎对和有误解shared_from_this

如果您已经有一个,则不需要使用它shared_from_this检索 a 。shared_ptr在您的示例中,您可以这样做:

auto ptr_a = std::make_shared<A>();
auto ptr_b = ptr_a;

但是,在某些情况下,设计要求类知道其共享生命周期——并且必须能够将 a 检索shared_ptr到自身。在这种情况下,您不能简单地这样做:std::shared_ptr<A>{ this }因为这将产生一个跟踪指针的 shared_ptr节点this-- 这可能导致错误/双重删除。

shared_from_this()通过允许类的内部能够将安全shared_ptr对象检索到已分配的对象来解决此问题。以我的经验,这种模式在异步回调处理程序中最常见。例如:

auto A::do_something_async() -> void
{
    auto self = shared_from_this();
    std::thread{[self]{
        // do something long-living with 'self'
    }}.detach();
}

注意:我不提倡这种代码风格;只是这是它的可能用途。一般来说,我发现最好设计类,使其永远不依赖于知道自己的生命周期。

于 2021-11-17T03:56:13.107 回答