提升asio和shared_ptrs的扩散

时间:2010-11-04 17:04:15

标签: c++ boost boost-asio

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

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

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

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

3 个答案:

答案 0 :(得分:6)

阅读io_service析构函数

documentation
  

描述的破坏序列   以上允许程序简化   他们的资源管理使用   的shared_ptr<取代。对象的位置   寿命与a的寿命有关   连接(或其他一些序列)   异步操作),一个shared_ptr   将对象绑定到   所有异步处理程序   与之相关的操作。这个   工作原理如下:

     

当单个连接结束时,全部   关联的异步操作   完成。相应的处理程序   对象被摧毁,所有   shared_ptr对象的引用   被毁了。

     

关闭整个   程序,io_service函数   调用stop()来终止任何   run()尽快调用。该   上面定义的io_service析构函数   摧毁所有处理程序,造成一切   shared_ptr引用所有   要销毁的连接对象。

换句话说,使用shared_ptr代替裸指针会更容易指数化。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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