我最近开始使用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
或类似的东西(vector
,auto_ptr
等)是维持异常安全所必需的。您将delete
调用放入代码的瞬间,可能会抛出异常,导致删除内存,泄漏内存。
如果您正在使用所有堆栈分配的对象,并且可以通过这种方式逃脱,请务必这样做。我猜你所看到的大多数shared_ptr
s的原因是因为有人想要存储具有多态行为的对象,并且不希望受到切片问题的影响。
引用计数是执行异步操作所固有的。否则,无法知道对象何时不再使用。您可以通过维护自己的引用计数来避免使用shared_ptr
。但是你会在很大程度上重新实现同样的事情。这里的问题不是shared_ptr
,而是你对它的态度。您应该简单地接受引用计数对于异步代码是必要的,因此shared_ptr
是一种自然的解决方案。