我想知道传递给上述方法的对象的生命周期是什么。
ip::basic_resolver::async_resolve(const query & q, ResolveHandler handler);
(1)在调用处理程序之前,我是否需要将解析器保持活动状态? (是)
(2)async_resolve是否复制query
对象? (我正在传递一个在堆栈上创建的 - 是的)
{
boost::asio::ip::tcp::resolver::query query(host_, port_);
resolver_.async_resolve(query, );
}
(3)boost::asio::ip::tcp::resolver::iterator
是否按值返回处理程序? (是)
template<..> void async_connect(basic_socket<Protocol, SocketService> & s,
Iterator begin, ComposedConnectHandler h);
(4)begin
是否按值传递? (是)
(5)我需要保持resolver
活着吗? (无)
答案 0 :(得分:3)
使用Boost.Asio,一般规则是:
当规则有例外时,文档会指出它,例如boost::asio::async_write
的 buffers 参数的情况,在调用处理程序之前必须保持有效。< / p>
boost::asio::error::operation_aborted
调用异步操作处理程序。如果您不想管理服务对象的生命周期,请使用shard_ptr
进行管理,并将shared_ptr
的副本绑定到处理程序中。对于async_resolve
,query
对象由const-reference传递,最终复制到底层操作的构造函数(resolve_endpoint_op
)中。这也允许使用临时query
对象。
{
typedef boost::asio::ip::tcp::resolver::query query;
resolver_.async_resolve(query(host_, port_), );
}
async_resolve
期望处理程序满足ResolverHandler要求。它记录了 iterator 参数是按值获取的。
resolver
不需要保持活动状态,因为迭代器已共享查询结果的所有权。虽然不在文档中,ip::basic_resolver_iterator
维护shared_ptr
std::vector
个ip::basic_resolver_entry
个对象。 basic_resolver_entry
对象具有端点,主机名和服务名称的成员变量。