为何asio的async_read_until()内部以std::string存储分隔符?
为什么Asio的async_read_until(string_view delim)会复制分隔符?
异步操作的延迟执行特性:Asio的异步调用是"fire-and-forget"模式,调用
async_read_until后函数立刻返回,实际的读取和分隔符匹配逻辑要等到IO事件触发才会执行。这就要求操作依赖的所有数据,必须在从调用到回调完成的整个周期内都有效。std::string_view不管理内存:
std::string_view只是个视图,它不持有任何字符数据的所有权,只是指向已有字符串的一段内存。如果用户传入的string_view对应的原始字符串(比如局部变量、临时对象)在异步操作完成前被销毁或者修改,Asio后续执行匹配逻辑时就会访问无效内存,触发未定义行为。保障异步操作的安全性:为了避免这种风险,Asio必须把分隔符的内容复制到自己管理的
std::string里。这样不管用户的原始字符串什么时候失效,Asio手里的分隔符副本都能正常使用,确保读取匹配逻辑能顺利完成。和缓冲区模型的设计互补:虽然Asio通常让用户管理读写缓冲区的生命周期,但那是因为用户清楚自己的缓冲区什么时候可以安全回收。但分隔符是异步操作内部逻辑的依赖数据,Asio没法信任用户会一直保证它的有效性,所以主动接管这部分内存管理是合理的设计权衡。
内容的提问来源于stack exchange,提问作者niXman
相关产品推荐
相关产品推荐

