async_write(*this, BoostAsio::buffer(pck->_storage), boost::bind(&tcp_socket::handle_wrote, this, pck, BoostAsio::placeholders::error));
pck在堆上分配,如果我删除它,_storage也会变得无效,或者async_write将缓冲区复制到其内部结构中,它可以在堆栈上自由删除/分配?
谢谢。
答案 0 :(得分:2)
async_write
函数不会复制缓冲区。它将内部const_buffer
对象传递给更深层的库函数。 const_buffer
对象包含指向实际缓冲区的内部指针,因此不执行深层复制。在调用异步处理程序之前,您需要确保pck->storage
保持有效。
请注意,这肯定是最好的。每次复制缓冲区都会造成很大的性能损失。
答案 1 :(得分:0)
请注意缓冲区或至少部分缓冲区将被复制到内核的套接字缓冲区中。通常这不是什么大问题。但是,您可以将发送缓冲区设置为零,以便在操作期间使用应用程序的缓冲区。当然,如果不了解禁用发送缓冲区的其他后果,则不应该这样做。