强制boost::asio::buffer按值复制
Force boost::asio::buffer to copy by value
我使用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)中的元素对于接受类型参数的
21.3)。boost::asio::buffer
重载std::basic_string
,返回的缓冲区对象无效根据引用无效定义的规则,指向序列元素的指针和迭代器(c++ Std;
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 使用strcpy将char数组的元素复制到另一个数组
- 是否可以初始化不可复制类型的成员变量(或基类)
- 提升 ASIO 无法识别计时器对象
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 复制列表初始化的隐式转换的等级是多少
- 当从函数参数中的临时值调用复制构造函数时
- 有可能在Armadillo中复制MATLAB circshift方法吗
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 复制几乎为空的数组的最快方法
- boost::asio 以async_read复制输入数据
- 如何复制或重复使用boost :: asio :: streambuf
- 为什么Boost.Asio处理程序必须是可复制的
- boost::与boost:asio绑定在一起.boost::绑定不起作用,从示例中复制
- 将数据从 boost::asio::streambuf 复制到 std::string
- 为什么我无法访问在类"boost::asio::d etail::不可复制"中声明的私人成员?
- 强制boost::asio::buffer按值复制