0

通常、boost.asio による非同期操作で使用されるバッファーの有効期間を管理するために、共有ポインターを使用してこの手法を使用します。

バッファがstd::stringオブジェクトの場合はどうなりますか (内部参照カウントなどを行うため、これは少し特殊だと思います)。非同期操作のハンドラに渡す文字列オブジェクトの共有ポインタはまだ必要ですか? または、以下は安全ですか?(そして、なぜ/なぜではないのですか?)

void handler()
{
}

void func()
{
    std::ostringstream stringbuilder;
    // fill stringbuilder

    socket.async_send(boost::asio::buffer(stringbuilder.str()), boost:bind(handler));
}
4

1 に答える 1

2

std::string内部的に参照がカウントされる場合でも、によって管理される基礎となるメモリstd::stringは、非同期操作の間ずっと有効である必要があります。最も早く破棄できるのは、ハンドラーの開始時です。多くの場合、 ashared_ptrは、非同期操作全体で有効なままになるように、バッファーの有効期間を延長するために使用されます。

ドキュメントごと:

書き込まれるデータを含む 1 つ以上のバッファー。buffers オブジェクトは必要に応じてコピーできますが、基になるメモリ ブロックの所有権は呼び出し元によって保持されます。呼び出し元は、ハンドラーが呼び出されるまでそれらが有効であることを保証する必要があります。

この特定のケースでboost::asio::buffer()は、文字列を参照によって取得します。したがって、内部参照カウントは発生しません。

template<
    typename Elem,
    typename Traits,
    typename Allocator>
const_buffers_1 buffer(
    const std::basic_string< Elem, Traits, Allocator > & data);

socket.async_send(...)ステートメントが戻ると、一時的にstd::string返されたものstringbuilder.str()が破棄され、非同期操作のバッファーの有効期間要件が無効になります。

于 2013-06-28T12:28:57.530 に答える