字符串追加 string_view 意外结果

jur*_*ang 2 c++ string-view

#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;
}

Run Code Online (Sandbox Code Playgroud)

操作系统版本

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

Run Code Online (Sandbox Code Playgroud)

海湾合作委员会版本

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

Run Code Online (Sandbox Code Playgroud)

调试信息 最终结果

预期返回“xx”,但为什么返回奇怪的字符串?

Ted*_*gmo 5

s在作用域结束时(return_string_view返回时)被销毁,因此std::string_view返回的是已停止存在的return_string_viewa 的视图。std::string

请记住,astring_view并不拥有它所查看的内存。它通常被实现为指针和长度,但实际数据由 拥有s

从 指出的内存中读取会使string_view程序出现未定义的行为。该程序可能会崩溃,甚至更糟。

  • @jurkDang 它可能会返回任何内容或崩溃,因为在 `main` 中调用 `peeked.front()` 具有_未定义的行为_。就像你有 `const char* foo() { std::string x = "Hello"; 返回 x.c_str(); }` 然后执行 `std::cout &lt;&lt; foo();`。同样的问题。当“x”超出范围后,指针无效。 (2认同)