string拼接string_view得到异常结果,求原因分析
问题描述
预期程序输出"xx",但实际得到异常字符串,请问原因是什么?
相关C++代码
#include <iostream> std::string_view return_string_view(); using namespace std; int main() { string got; auto peeked = return_string_view(); got += peeked; cout << got << endl; return 0; } string_view return_string_view() { string const s = string().assign( 2, 'x' ); auto sv = string_view( s.c_str() ); return sv; }
运行环境
- 操作系统版本:
Linux vm 5.19.0-45-generic #46-Ubuntu SMP PREEMPT_DYNAMIC Wed Jun 7 09:08:58 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
- GCC版本:
Linux vm 5.19.0-45-generic #46-Ubuntu SMP PREEMPT_DYNAMIC Wed Jun 7 09:08:58 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
(注:此处GCC版本信息疑似输入错误,应为GCC具体版本号)
调试与运行结果
- 调试信息:返回的string_view指向已被释放的内存区域
- 最终运行结果:输出异常乱码
原因分析
这是典型的悬垂string_view问题:
- 在
return_string_view函数中,s是局部的const string对象,函数执行完毕返回时,该局部对象会被销毁,它管理的存储"xx"的内存区域会被释放。 string_view本身不持有内存,仅作为现有字符序列的视图存在。这里创建的sv指向的是s.c_str()返回的地址,也就是s管理的内存区域。- 函数返回后,
peeked这个string_view就指向了已被释放的内存空间,后续对它的访问属于未定义行为,读取到的是内存中的垃圾数据,因此输出异常字符串。
内容的提问来源于stack exchange,提问作者jurkDang
相关产品推荐
相关产品推荐

