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

Lifetime management of std::string when used in asynchronous boost.asio operation

本文关键字:string 管理 生存期 std boost 异步 asio 操作      更新时间:2023-10-16

通常我使用共享指针来管理boost.asio.异步操作中使用的缓冲区的寿命

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

void handler()
{
}
void func()
{
    std::ostringstream stringbuilder;
    // fill stringbuilder
    socket.async_send(boost::asio::buffer(stringbuilder.str()), boost:bind(handler));
}

即使std::string可能被内部引用计数,std::string管理的底层内存在整个异步操作期间必须保持有效。它最早可以被销毁是在处理程序开始时。通常,shared_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(...)语句返回,从stringbuilder.str()返回的临时std::string将被销毁,并使异步操作的缓冲区的生存期要求无效。