首页 文章

强制boost :: asio :: buffer按值复制

提问于
浏览
9

我使用boost :: asio :: buffer来发送消息

void Send(const std::string& messageData)
{
    socket.async_write(boost::asio::buffer(messageData), ...);
}

并在io_service线程中的某处遇到“字符串迭代器不可解除”的运行时错误 . 当我创建对象的变量来存储缓冲区的消息数据时:

void Send(const std::string& messageData)
{
    this->tempStorage = messageData;
    socket.async_write(boost::asio::buffer(this->tempStorage), ...);
}

错误永远不会发生 . 几乎在Send()调用之后释放std :: string(引用了messageData) - boost :: asio :: buffer是否只存储对象的引用?如果是这样,我如何强制它按值存储数据?

2 回答

  • 1

    来自boost-users邮件列表的回答:

    如果确实如此,那么它将完全无用,因为您无法访问完成处理程序中的任何缓冲区 .

    使用buffer()的方法是传入对存储的引用,以其他方式保证生命周期 .

    您可以将其存储在外部对象中,也可以将其存储在“this”中,或者将其绑定到完成处理函数对象本身 .

    void onComplete(shared_ptr<std::string> s, error_code const&, size_t)
    {
        // do stuff
    }
    
    void send(std::string const& messageData)
    {
        shared_ptr<std::string> s = make_shared<std::string>(messageData);
        async_send(socket, boost::asio::buffer(*s),
        boost::bind(&T::onSend, this, s, _1, _2));
    }
    

    这确保缓冲区数据的生存期至少与完成处理程序存在时一样长 .

  • 15

    来自asio的引用/缓冲区说“缓冲区对象没有它所引用的内存的任何所有权 . 应用程序负责确保内存区域保持有效,直到I / O操作不再需要它为止 . ”内存不再可用,缓冲区据说已经失效 .

    对于接受类型为std :: vector的参数的boost :: asio :: buffer重载,返回的缓冲区对象由任何向量操作无效,该操作也使引用序列中元素的所有引用,指针和迭代器无效(C Std) ,23.2.4)

    对于接受类型为std :: basic_string的参数的boost :: asio :: buffer重载,返回的缓冲区对象根据为引用无效的规则而定义,指针和迭代器引用序列的元素(C Std, 21.3) . “

相关问题