我使用boost :: asio :: buffer来发送消息
void Send(const std::string& messageData)
{
socket.async_write(boost::asio::buffer(messageData), ...);
}
Run Code Online (Sandbox Code Playgroud)
并在io_service线程中的某处遇到"字符串迭代器不可解除"的运行时错误.当我创建对象的变量来存储缓冲区的消息数据时:
void Send(const std::string& messageData)
{
this->tempStorage = messageData;
socket.async_write(boost::asio::buffer(this->tempStorage), ...);
}
Run Code Online (Sandbox Code Playgroud)
错误永远不会发生.几乎在Send()调用之后释放std :: string(引用了messageData) - boost :: asio :: buffer是否只存储对象的引用?如果是这样,我如何强制它按值存储数据?
Sla*_*lav 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));
}
Run Code Online (Sandbox Code Playgroud)
这确保缓冲区数据的生存期至少与完成处理程序存在时一样长.