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

Force boost::asio::buffer to copy by value

本文关键字:复制 asio boost 强制 buffer      更新时间:2023-10-16

我使用boost::asio::buffer来使用

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

在io_service线程中遇到"string iterator not dereferencable"运行时错误。当我创建对象变量来存储缓冲区的消息数据时:

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

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

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

如果有,它将是完全无用的,因为你没有访问完成处理程序中的任何缓冲区。

使用buffer()的方法是传递对存储的引用的使用寿命

可以将其存储在外部对象中,也可以将其存储在' this',或者将它绑定到completion handler函数对象本身。

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

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

摘自boost::asio的文档:

缓冲区对象对它所引用的内存没有任何所有权出现。确保内存是应用程序的责任区域在I/O不再需要之前保持有效操作。当内存不再可用时,就说缓冲区

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

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

21.3)。