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用于延长缓冲区的生命周期,以便它在整个异步操作期间保持有效。

根据文档

包含要写入的数据的一个或多个缓冲区。尽管缓冲区对象可以根据需要被复制,但底层内存块的所有权由调用者保留,它必须保证它们在调用处理程序之前保持有效。

在这种特殊情况下,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返回的 fromstringbuilder.str()将被销毁,并使异步操作缓冲区的生存期要求无效。

于 2013-06-28T12:28:57.530 回答