在异步boost.asio操作中使用时,std :: string的生命周期管理

时间:2013-06-28 09:46:32

标签: c++ boost-asio

通常我使用this技术使用共享指针来管理在使用boost.asio的异步操作中使用的缓冲区的生命周期。

如果我的缓冲区是std::string对象怎么办(我觉得它有点特殊,因为它会进行一些内部引用计数等)?我还需要一个字符串对象的共享指针,我将其传递给异步操作的处理程序吗?或者以下安全吗? (为什么/为什么不呢?)

void handler()
{
}

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

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

1 个答案:

答案 0 :(得分:2)

即使std::string可能在内部引用计数,std::string管理的基础内存在整个异步操作期间也必须保持有效。最早可以销毁的是处理程序的开头。通常,shared_ptr用于延长缓冲区的生命周期,以便在整个异步操作期间保持有效。

根据documentation

  

包含要写入的数据的一个或多个缓冲区。尽管可以根据需要复制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()被销毁,并使异步操作缓冲区的生存期要求无效。