You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向接收std::string_view的函数传递临时std::string是否安全?

std::string_view 常见问题解答:临时对象安全与substr用法

问题1:向接收std::string_view的函数传递临时std::string是否安全?

这段代码是安全的,不存在未定义行为。

原因如下:

  • 临时std::string("abc")的生命周期会持续到整个函数调用表达式结束,也就是foo函数执行完毕之后才会被销毁。
  • std::string_view的构造函数接受const std::string&参数,构造出的视图会指向临时string的内部字符缓冲区。在foo函数执行期间,临时string的缓冲区始终有效,因此string_view可以安全访问其指向的内容。
  • 这里不存在生命周期提前结束的问题:临时对象只会在foo(string("abc"))这一完整表达式执行完毕后才会被析构。

问题2:为何要先转std::string_view再调用substr,而非直接对std::string调用?

这么做核心是避免不必要的内存分配与拷贝,提升性能,具体分析:

  • 如果直接对std::string调用substr,返回的是一个新的std::string对象,会分配新内存并拷贝子串内容,在数据量较大的场景(比如LeetCode的测试用例)中,会带来额外的性能开销。
  • 而std::string_view::substr返回的是另一个std::string_view对象,它只是原字符串的一个视图,不会分配新内存,也不会拷贝字符数据,仅记录子串的起始位置和长度,效率远高于std::string::substr。
  • 另外,如果nums[i]是const char*类型(而非std::string),直接调用substr是语法错误,因为C风格字符串没有成员函数;转为string_view后就能统一调用substr方法,提升代码的通用性。

std::string_view与临时对象交互的最佳实践

  • 仅在确定源对象生命周期足够长时使用string_view:如果string_view指向的对象(比如临时对象)在string_view存活期间被销毁,就会出现悬空指针,导致未定义行为。比如不能将临时对象的string_view存储到全局变量、静态变量,或者作为函数返回值(除非能确保源对象生命周期覆盖string_view的使用周期)。
  • 优先用string_view作为函数参数:对于只读的字符串输入,用string_view替代const std::string&,可以同时兼容std::string、const char*等多种字符串类型,避免不必要的隐式构造。
  • 避免用string_view长期存储子串结果:如果需要长期持有子串内容,应该将string_view转为std::string,否则一旦源字符串被修改或销毁,string_view就会失效。

内容的提问来源于stack exchange,提问作者Yan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 06:53:18