【问题标题】:when to use shared_from_this()何时使用 shared_from_this()
【发布时间】:2021-12-28 02:10:16
【问题描述】:

如果我想为 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_from_this这个问题很好,但是你的理解有点偏离。如果您已经拥有shared_ptr,则您不需要需要使用shared_from_thisshared_from_this 作为一种从类inside 中获取自身shared_ptr 的机制而存在——这对于异步消息回调等某些情况很有用。除非出现这种情况,否则您可能根本不需要使用它
  • @Human-Compiler 已经将我的问题改为您的建议。当我看到“从班级内部获取其自身的 shared_ptr”时,您的回答给了我一个提示。非常感谢。
  • shared_ptrshared_from_this 使用更频繁/更广泛。 shared_from_this 有时用于设计相对复杂的多线程编程中。如需参考,请参阅this 关于 enable_shared_from_this 的帖子 - 概述、示例和内部。
  • @aafulei 非常有用的信息和您回复中的链接,非常感谢。

标签: c++ shared-ptr enable-shared-from-this


【解决方案1】:

您似乎对shared_ptrshared_from_this 有误解。

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

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

但是,在某些情况下,设计要求类知道其共享生命周期——并且必须能够检索到自己的shared_ptr。在这种情况下,您不能简单地这样做:std::shared_ptr&lt;A&gt;{ this },因为这将产生一个 new 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();
}

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

【讨论】:

  • 非常感谢。你的代码意味着如果我想做一些异步工作,我需要保证我的类还活着,并且在类中使用共享 ptr 更安全。对吗?
  • 是的,您需要保证被操作的对象是活动的。 shared_from_this 只是在您希望实例知道其自己的共享生命周期的情况下实现这一目标的工具。当然,还有其他方法可以在不使用 shared_from_this 的情况下实现这一点——例如仅共享 data 并且不让整个类都知道共享的生命周期。
  • 我建议使用std::enable_shared_from_this&lt;A&gt; 的类将构造函数设为私有并提供返回std::shared_ptr 的工厂方法。因此,shared_from_this() 不会被 std::shared_ptr 处理的对象滥用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-07
  • 1970-01-01
  • 2015-02-26
  • 1970-01-01
  • 2018-06-03
相关资源
最近更新 更多