Async使用boost :: asio发送自动变量。可能吗?

时间:2014-08-04 07:26:07

标签: c++ boost-asio

我仍在尝试理解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而不会产生严重后果。我哪里错了?

1 个答案:

答案 0 :(得分:2)

async_write并不真正将消息排入网络堆栈。相反,它将写入队列以增强io_service所拥有的异步任务队列。当您在run上调用io_service时,实际上会发生对网络堆栈的写入。简而言之,有一个中间队列。

在你的情况下,boost::asio::buffer会保留对' msg'的引用。而不是它的副本。如果msg超出范围,当您的邮件发送到网络堆栈时,buffer指向对字符串的悬空引用。