gpt4 book ai didi

c++ - 强制 boost::asio::buffer 按值复制

转载 作者:可可西里 更新时间:2023-11-01 16:30:33 25 4
gpt4 key购买 nike

我使用 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), ...);
}

错误从未发生过。std::string(messageData 被引用到)几乎在 Send() 调用后立即被释放 - boost::asio::buffer 是否仅存储对对象的引用?如果是这样,我如何强制它按值存储数据?

最佳答案

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

如果这样做了,那将是完全无用的,因为您无权访问完成处理程序中的任何缓冲区。

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

您可以将其存储在外部对象中,也可以将其存储在`this' 就像你做的那样,或者通过将它绑定(bind)到完成处理函数中对象本身。

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

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

关于c++ - 强制 boost::asio::buffer 按值复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5861722/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com