我使用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 回答
来自boost-users邮件列表的回答:
如果确实如此,那么它将完全无用,因为您无法访问完成处理程序中的任何缓冲区 .
使用buffer()的方法是传入对存储的引用,以其他方式保证生命周期 .
您可以将其存储在外部对象中,也可以将其存储在“this”中,或者将其绑定到完成处理函数对象本身 .
这确保缓冲区数据的生存期至少与完成处理程序存在时一样长 .
来自asio的引用/缓冲区说“缓冲区对象没有它所引用的内存的任何所有权 . 应用程序负责确保内存区域保持有效,直到I / O操作不再需要它为止 . ”内存不再可用,缓冲区据说已经失效 .
对于接受类型为std :: vector的参数的boost :: asio :: buffer重载,返回的缓冲区对象由任何向量操作无效,该操作也使引用序列中元素的所有引用,指针和迭代器无效(C Std) ,23.2.4)
对于接受类型为std :: basic_string的参数的boost :: asio :: buffer重载,返回的缓冲区对象根据为引用无效的规则而定义,指针和迭代器引用序列的元素(C Std, 21.3) . “