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

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问题:

  1. 在return_string_view函数中,s是局部的const string对象,函数执行完毕返回时,该局部对象会被销毁,它管理的存储"xx"的内存区域会被释放。
  2. string_view本身不持有内存,仅作为现有字符序列的视图存在。这里创建的sv指向的是s.c_str()返回的地址,也就是s管理的内存区域。
  3. 函数返回后,peeked这个string_view就指向了已被释放的内存空间,后续对它的访问属于未定义行为,读取到的是内存中的垃圾数据,因此输出异常字符串。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 09:12:57