1

上記のメソッドに渡されるオブジェクトの有効期間を知りたいです。

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生き続ける必要がありますか? (番号)

4

1 に答える 1

3

Boost.Asio の一般的なルールは次のとおりです。

  • const-reference または value によって渡された引数はコピーされます。サポートされている場合は、移動できます。
  • non-const-reference によって渡された引数は、同期操作が完了するか、非同期操作のハンドラーが呼び出されるまで有効である必要があります。

ルールに例外がある場合は、ハンドラーが呼び出されるまで有効である必要があるのbuffers引数の場合など、ドキュメントでそれが示されます。boost::asio::async_write


の場合ip::basic_resolver:

  • 他のサービス オブジェクトと同様に、サービス オブジェクトが未処理の非同期操作で破棄された場合、非同期操作ハンドラーが で呼び出されboost::asio::error::operation_abortedます。サービス オブジェクトの寿命を管理したくない場合は、 で管理し、のコピーをハンドラshard_ptrにバインドします。shared_ptr
  • オブジェクトはconst-reference によって渡されasync_resolvequery最終的に基になる操作のコンストラクター ( resolve_endpoint_op) にコピーされます。これにより、一時queryオブジェクトの使用も許可されます。

    {
      typedef boost::asio::ip::tcp::resolver::query query;
      resolver_.async_resolve(query(host_, port_), );
    }
    
  • async_resolveハンドラーがResolverHandlerの要件を満たすことを期待します。iterator引数が値によって取得されることが文書化されています。

の場合boost::asio::async_connect:

  • ドキュメントによると、begin引数は値で渡されます。
  • イテレータはクエリ結果のresolver所有権を共有しているため、 は存続する必要はありません。ドキュメントにはありませんが、はオブジェクトの をip::basic_resolver_iterator維持します。オブジェクトには、エンドポイント、ホスト名、およびサービス名のメンバー変数があります。shared_ptrstd::vectorip::basic_resolver_entrybasic_resolver_entry
于 2012-10-09T14:38:45.120 に答える