1

我想知道传递给上述方法的对象的生命周期是什么。

异步解析

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生命吗?(不)

4

1 回答 1

3

使用 Boost.Asio,一般规则是:

  • 通过 const-reference 或 value 传递的参数被复制。如果支持,它们可能会被移动。
  • 非 const-reference 传递的参数必须保持有效,直到同步操作完成或调用异步操作的处理程序。

当规则有例外时,文档会指出它,例如buffers参数的情况,在boost::asio::async_write调用处理程序之前必须保持有效。


对于ip::basic_resolver

  • 与其他服务对象一样,如果服务对象因未完成的异步操作而被销毁,则异步操作处理程序将被调用boost::asio::error::operation_aborted。如果您不想管理服务对象的生命周期,则使用 a 对其进行管理并将shard_ptr其副本绑定shared_ptr到处理程序中。
  • 因为对象通过 const-reference 传递并最终复制到底层操作的构造函数 ( async_resolve)中。这也允许使用临时对象。queryresolve_endpoint_opquery

    {
      typedef boost::asio::ip::tcp::resolver::query query;
      resolver_.async_resolve(query(host_, port_), );
    }
    
  • async_resolve期望处理程序满足ResolverHandler要求。它记录了迭代器参数是按值获取的。

对于boost::asio::async_connect

  • 根据文档,开始参数是按值传递的。
  • resolver不需要保持活动状态,因为迭代器共享查询结果的所有权。虽然不在文档中,但ip::basic_resolver_iterator维护了一个shared_ptr对象。这些对象具有端点、主机名和服务名的成员变量。std::vectorip::basic_resolver_entrybasic_resolver_entry
于 2012-10-09T14:38:45.120 回答