最近玩了很多 Boost.Asio。我非常喜欢这个库,因为它提供了一种从当今多核系统中榨取性能的绝妙方法。
我曾多次问过自己一个问题,我认为在使用 Asio 进行异步调用时,关于对象生命周期/所有权的问题值得一提。
我反复遇到的问题是,您经常不得不“过期”一个仍然有异步回调待处理的对象。如果该对象在调用回调之前超出范围,则不可避免地会发生故障。
为了解决这个问题,我使用 boost::enable_shared_from_this
模板作为大多数基于 asio 的类的基类。这工作正常,但有点麻烦:通常这也意味着保护构造函数并向类添加工厂方法以确保在 shared_ptr 内创建所有实例。
我只是想知道其他人是如何解决这个问题的。我是最好的方法吗?还是我的 Asio.Foo 都错了?
讨论... :)
最佳答案
使用 boost::enable_shared_from_this
几乎可以做到这一点。此外,如果您需要对不应保留对象的对象的引用,如果它们是唯一保留的引用,请考虑使用 boost::weak_ptr
。
使用 weak_ptr
的一个很好的例子:我在使用 boost::asio
的套接字类中使用 enable_shared_from_this
。 boost::asio
框架是唯一通过读写处理程序存储对对象的持久引用的东西。因此,当调用套接字的析构函数时,我知道套接字已关闭,我可以在处理程序中“做一些事情”以清理该关闭的套接字。使用套接字的应用程序只有一个 weak_ptr
引用,当它想要使用套接字(通常是写入它)时,它会将其 boost 为 shared_ptr
。如果套接字消失,可以检查该 boost 是否失败,尽管套接字的关闭处理程序通常会在此之前适本地清理所有 weak_ptr
引用。
关于c++ - 使用 Boost.Asio 时确保有效对象生命周期的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/423739/