我仍在尝试理解boost::asio
C ++库的工作。
根据我之前question的答案,async_write()
方法将消息排入网络堆栈并立即返回。但是,在documentation他们说这样做是错误的:
void dont_do_this()
{
std::string msg = "Hello, world!";
boost::asio::async_write(socket, boost::asio::buffer(msg), my_handler);
}
他们坚持认为我们需要确保操作的缓冲区有效,直到调用完成处理程序。问题是为什么?在async_write返回时,我们已经将消息放入网络堆栈中,我们不再需要缓冲区,并且可以销毁自动变量msg
而不会产生严重后果。我哪里错了?
答案 0 :(得分:2)
async_write
并不真正将消息排入网络堆栈。相反,它将写入队列以增强io_service
所拥有的异步任务队列。当您在run
上调用io_service
时,实际上会发生对网络堆栈的写入。简而言之,有一个中间队列。
在你的情况下,boost::asio::buffer
会保留对' msg'的引用。而不是它的副本。如果msg
超出范围,当您的邮件发送到网络堆栈时,buffer
指向对字符串的悬空引用。