我最近开始使用boost。到目前为止,大多数事情都非常直接。但是让我疯狂的一件事是整个提升过程中shared_ptr的扩散。即使在简单的例子中,也使用了shared_ptr。
所以我的问题是,如果我使用boost来接受tcp连接然后处理它们。只要我保证在使用tcp完成之前不会删除在堆上创建的对象(boost :: asio :: ip :: tcp :: socket,以及将为异步方法调用的类) ,那么我不需要shared_ptr正确吗?
我编写了一个简单的tcp服务器和客户端,而不是使用共享ptr,它可以工作。但我只是想在外界确认我的评估是正确的。
另外,根据您的经验,您是否有需要使用shared_ptr来安抚提升?
答案 0 :(得分:6)
阅读io_service
析构函数
换句话说,使用描述的破坏序列 以上允许程序简化 他们的资源管理使用 的shared_ptr<取代。对象的位置 寿命与a的寿命有关 连接(或其他一些序列) 异步操作),一个shared_ptr 将对象绑定到 所有异步处理程序 与之相关的操作。这个 工作原理如下:
当单个连接结束时,全部 关联的异步操作 完成。相应的处理程序 对象被摧毁,所有 shared_ptr对象的引用 被毁了。
关闭整个 程序,io_service函数 调用stop()来终止任何 run()尽快调用。该 上面定义的io_service析构函数 摧毁所有处理程序,造成一切 shared_ptr引用所有 要销毁的连接对象。
shared_ptr
代替裸指针会更容易指数化。
答案 1 :(得分:1)
shared_ptr
或其类似内容(vector
,auto_ptr
等)是维护异常安全所必需的。您将delete
调用放入代码的瞬间,可能会抛出异常,导致删除内存,泄漏内存。
如果您正在使用所有堆栈分配的对象,并且可以通过这种方式逃脱,请务必这样做。我猜你所看到的大多数shared_ptr
s的原因是因为有人想要存储具有多态行为的对象,并且不希望受到切片问题的影响。
答案 2 :(得分:0)
引用计数是执行异步操作所固有的。否则,无法知道对象何时不再使用。您可以通过维护自己的引用计数来避免shared_ptr
。但是你会在很大程度上重新实现同样的事情。这里的问题不是shared_ptr
,而是你对此的态度。您应该简单地接受异步代码需要引用计数,因此shared_ptr
是一种自然的解决方案。