c – Boost.asio和异步链,unique_ptr?

我对异步编程不是很熟悉,我有一个问题.

我的问题如下.在boost.asio:http://www.boost.org/doc/libs/1_60_0/doc/html/boost_asio/example/cpp11/spawn/echo_server.cpp中给出C11的echo_server示例

我想知道std :: make_shared< session>可以在C 14中用C 14中的std :: unique_ptr< session>替换,以避免引用计数的开销.

我不确定,因为我们有shared_from_this()但不是unique_from_this(),所以如何访问unique_ptr< session>从里面?

最佳答案 不,在asio编程中使用shared_ptr是惯用的.

我们的想法是,未完成处理程序的数量与启动异步操作的对象的共享计数相匹配.这是通过将管理对象的shared_ptr的副本绑定到处理函数对象来实现的.

c 11/14的方法是用std :: shared_ptr替换boost :: shared_ptr(std :: bind,lambdas等也与asio完美配合).

更新,现在我完全理解了这个问题:

在您链接的示例中,我认为您指的是在方法go()中创建的名为self的shared_ptr?如果你愿意,你可以在没有shared_ptr的情况下编写它.你必须删除这个作为go()的最后一行.您还必须记住捕获任何异常以确保采用此代码路径.当然可以设置unique_ptr来执行此操作,但是在构建会话和成功创建采用unique_ptr之间存在生命周期管理问题. shared_ptr减轻了一个原子公司成本的管理负担……

在这种情况下答案是严格的“是”,但imho我会建议,因为它更脆弱.

点赞