2012-10-09 37 views
1

我想知道什么是传递给提到的方法的对象的生命周期。async_resolve和async_connect params生存期

async_resolve

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? (是)

async_connect

template<..> void async_connect(basic_socket<Protocol, SocketService> & s, 
Iterator begin, ComposedConnectHandler h); 

(4)begin按值传递? (是)
(5)我需要保持resolver还活着吗? (无)

回答

3

随着Boost.Asio的,一般的规则是,:

  • 参数以const引用或值传递被复制。如果支持,他们可能会被移动。
  • 由非const引用传递的参数需要保持有效,直到同步操作完成或调用异步操作的处理程序为止。

当有例外的规则,文档会显示它,如缓冲区论据boost::asio::async_write,直到处理函数必须保持有效的情况下。


对于ip::basic_resolver

  • 与其他服务对象,如果服务对象与未完成的异步操作的破坏,然后异步操作的处理程序下面将boost::asio::error::operation_aborted调用。如果您不想管理服务对象的生命周期,请使用shard_ptr进行管理,并将shared_ptr的副本绑定到处理程序中。
  • 对于async_resolvequery对象由const引用传递并最终复制到基础操作的构造函数(resolve_endpoint_op)中。这也允许使用临时的query对象。

    { 
        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到的ip::basic_resolver_entry对象。 basic_resolver_entry对象具有端点,主机名和服务名称的成员变量。