C++ Boost.asio和异步链,唯一的\u ptr?

C++ Boost.asio和异步链,唯一的\u ptr?,c++,asynchronous,boost,boost-asio,asyncsocket,C++,Asynchronous,Boost,Boost Asio,Asyncsocket,我对异步编程不是很熟悉,我有一个问题 我的问题如下。给出boost.asio中C++11的echo_服务器示例: 我想知道是否可以在C++14中将std::make_shared替换为C++14中的std::unique_ptr,从而避免引用计数的开销 我不确定,因为我们有shared\u from\u this(),但不是unique\u from\u this(),所以我如何从this内部访问unique\u ptr?。不,在asio编程中使用shared\u ptr是惯用的 其思想是,未完

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

我的问题如下。给出boost.asio中C++11的echo_服务器示例:

我想知道是否可以在C++14中将
std::make_shared
替换为C++14中的
std::unique_ptr
,从而避免引用计数的开销


我不确定,因为我们有
shared\u from\u this()
,但不是
unique\u from\u this()
,所以我如何从
this
内部访问
unique\u ptr
?。

不,在
asio
编程中使用shared\u ptr是惯用的

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

c++11/14的方法是将
boost::shared_ptr
替换为
std::shared_ptr
std::bind
,lambdas等也能很好地与asio一起工作)

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


在您链接的示例中,我认为您指的是在方法go()中创建的名为self的共享_ptr?如果您愿意,您可以在不使用共享\u ptr的情况下编写它。您必须将delete this作为go()的最后一行。您还必须记住捕获任何异常,以确保采用此代码路径。当然,可以设置一个惟一的\u ptr来实现这一点,但是在构建会话和成功创建惟一的\u ptr之间存在一个生命周期管理问题。共享ptr减轻了一家原子公司成本的管理负担

在这种情况下,答案严格地说是“是的”,但我不建议这样做,因为它更脆


据我所知,会话对象将通过处理程序管道,一次一个。会话的状态永远不会被共享。为什么一个独特的ptr没有意义?关键是,当最新的处理程序完成时,内存将被释放。这是真的吗

是的,这就是诀窍。该库是围绕可复制的完成处理程序设计的

如果您担心开销,那么确实要避免共享\u ptr


在这种情况下,只需携带对某个状态的引用,该状态具有外部控制的生存期。只需确保它保持活动状态(就像处理io_服务对象本身一样)。

您知道,开销是每个实例的一个额外内存指针和共享ptr创建和删除时的引用计数波动,否则它与普通指针完全相同。此外,还不清楚您指的是哪一个共享ptr,因为该示例中有多个共享ptr。“来自此的唯一”的概念甚至没有意义。你不能随意创建一个指向内存地址的唯一指针,因为你会有一个关于谁清理了内存的竞争条件。据我所知,你的会话对象将通过一个处理程序管道,一次一个。会话的状态永远不会被共享。为什么一个独特的ptr没有意义?关键是,当最新的处理程序完成时,内存将被释放。这是真的吗?最近的还是最后的?如果有任何未完成的处理程序涉及该会话,它们最终都将触发(即使由于破坏套接字而取消)。您可以手动计数未完成的处理程序,并在会话为零时删除会话,但为什么呢?shared_ptr完全可以做到这一点,几乎没有开销。如果有会话,asio的循环中仍然有工作。它不会结束。因此,如果我没有错的话,将会发生以下情况:如果对每个会话使用unique_ptr,只有在没有更多工作时,循环才会完成。我同意开销可能很低,这更像是一个理论问题:)在您链接的示例中,我认为您指的是在方法go()中创建的名为self的共享ptr?如果您愿意,您可以在不使用共享\u ptr的情况下编写它。您必须将
删除此
作为
go()
的最后一行。您还必须记住捕获任何异常,以确保采用此代码路径。当然,可以设置一个惟一的\u ptr来实现这一点,但是在构建会话和成功创建惟一的\u ptr之间存在一个生命周期管理问题。共享ptr减轻了一家原子公司的管理负担。@GermánDiago…在这种情况下,当我说“不”时,我的意思是“是”:)我理解这一点,但这并没有回答我最初的问题,那就是:我能使用一个独特的ptr并做一个独特的ptr,它将自动进行,直到会话本身结束吗?如果你理解,为什么?还有,我不知道如何回答得更清楚?如果不是,那么直接在完成处理程序中使用它是不可能的,并且在用间接方式“掩盖”时,充其量只能是一个混乱。我的建议是在我的答案中。在C++14中,您可以捕获[My_ptr=move(My_ptr)],但我想知道是否还有剩余的问题。最关心的是“
unique\u from\u this()
”或类似的内容,因此我想知道这是否真的有可能实现:替换为unique\u ptr并具有类似的内容。您可以,但这不会使结果可复制。正如其他人提到的“独一无二的”这是毫无意义的。我对“类似事物”的建议从一开始就在答案中<代码>删除此
是破解该结果的一种方法。我认为代码是一种气味,但它可能接近你的心智模型。