何时使用 shared_from_this()



如果我想返回类 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;
}

你似乎对shared_ptrshared_from_this有误解。

如果您已经有shared_ptr,则无需使用shared_from_this即可检索。在您的示例中,您可以只执行以下操作:

auto ptr_a = std::make_shared<A>();
auto ptr_b = ptr_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();
}

注意:我不提倡这种风格的代码;只是说这是它的可能用途。总的来说,我发现设计类更好,这样它就永远不会依赖于了解自己的生命周期。

相关内容

  • 没有找到相关文章

最新更新