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

时间:2011-05-02 19:45:08

标签: c++ boost-asio

我使用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 个答案:

答案 0 :(得分:15)

来自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));
}

这可确保缓冲区数据的生命周期至少与之一样 完成处理程序存在。

答案 1 :(得分:1)

来自asio的参考/缓冲区的

说 “ 缓冲区对象没有对其引用的内存的任何所有权。应用程序负责确保内存区域保持有效,直到I / O操作不再需要它为止。当内存不再可用时,缓冲区被认为已失效。

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

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