c++ - 用于异步 boost.asio 操作时 std::string 的生命周期管理

标签 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));
}

最佳答案

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

根据 documentation :

One or more buffers containing the data to be written. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

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

关于c++ - 用于异步 boost.asio 操作时 std::string 的生命周期管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17361801/

相关文章:

c++ - 使用 cv::ml::StatModel::calcError 与在选定特征子集上训练的模型的 Opencv 错误

c++ - 无法使简单的 boost 网络示例正常工作,仅仅初始化服务器会立即导致错误

c++ - 从线程池调用时,boost 的 io_service 是否共享请求线程?

c++ - 调试和自由执行中的信号处理

c++ - 我什么时候必须使用 boost::asio:strand

c++ - 我不明白 DoNotOptimizeAway 的定义

c++ - 什么时候应该删除动态创建的单例对象?

c++ - sdl_ttf 填充不良的表面

c++ - boost multi_index 是如何实现的

c++ - 使用 Boost Asio 查找服务器 IP