提升asio和shared_ptrs的扩散

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了提升asio和shared_ptrs的扩散相关的知识,希望对你有一定的参考价值。

我最近开始使用boost。到目前为止,大多数事情都非常直接。但是让我疯狂的一件事是整个提升过程中shared_ptr的扩散。即使在简单的例子中,也使用了shared_ptr。

所以我的问题是,如果我使用boost来接受tcp连接然后处理它们。只要我保证在使用tcp完成之前不会删除在堆上创建的对象(boost :: asio :: ip :: tcp :: socket,以及将为异步方法调用的类)那么我不需要shared_ptr正确吗?

我写了一个简单的tcp服务器和客户端,不使用共享ptr,它的工作原理。但我只是想在外界确认我的评估是正确的。

另外,根据您的经验,您是否曾经需要使用shared_ptr来安抚提升?

答案

阅读documentation获取io_service析构函数

上述销毁序列允许程序通过使用shared_ptr <>来简化其资源管理。如果对象的生命周期与连接的生命周期(或其他一些异步操作序列)相关联,则对象的shared_ptr将绑定到与其关联的所有异步操作的处理程序中。其工作原理如下:

当单个连接结束时,所有关联的异步操作都将完成。销毁相应的处理程序对象,并销毁对对象的所有shared_ptr引用。

要关闭整个程序,调用io_service函数stop()以尽快终止所有run()调用。上面定义的io_service析构函数会破坏所有处理程序,导致对所有连接对象的所有shared_ptr引用都被销毁。

换句话说,使用shared_ptr代替裸指针将成倍地指数化。

另一答案

shared_ptr或类似的东西(vectorauto_ptr等)是维持异常安全所必需的。您将delete调用放入代码的瞬间,可能会抛出异常,导致删除内存,泄漏内存。

如果您正在使用所有堆栈分配的对象,并且可以通过这种方式逃脱,请务必这样做。我猜你所看到的大多数shared_ptrs的原因是因为有人想要存储具有多态行为的对象,并且不希望受到切片问题的影响。

另一答案

引用计数是执行异步操作所固有的。否则,无法知道对象何时不再使用。您可以通过维护自己的引用计数来避免使用shared_ptr。但是你会在很大程度上重新实现同样的事情。这里的问题不是shared_ptr,而是你对它的态度。您应该简单地接受引用计数对于异步代码是必要的,因此shared_ptr是一种自然的解决方案。

以上是关于提升asio和shared_ptrs的扩散的主要内容,如果未能解决你的问题,请参考以下文章

使用 boost::asio::ip::tcp::socket 作为 shared_ptr

提升 shared_ptr 和派生类

序列化部分工作 - boost::asio

shared_from_this使用boost :: asio抛出bad_weak_ptr

从套接字和 STDIN 提升 Asio 多线程

提升asio超时[重复]