范围和c ++指针

Bg1*_*987 5 c++ scope

我有以下代码:

using namespace std;
vector<string*> v;
{
  string s = "hello";
  v.push_back(&s);
}
{
  string ss = "goodbye";
  v.push_back(&ss);
}

cout << v.at(0)->c_str() << endl;
cout << v.at(1)->c_str() << endl;
Run Code Online (Sandbox Code Playgroud)

打印

goodbye
goodbye
Run Code Online (Sandbox Code Playgroud)

如果我删除范围括号,代码将打印

hello
goodbye
Run Code Online (Sandbox Code Playgroud)

当我离开第一个范围时,到第一个字符串的指针现在指向第二个范围时到底发生了什么?

Seb*_*ach 7

存储的指针在范围之后成为悬空指针,并且任何尝试读取它们指向的内容都会产生未定义的行为.

  • 未定义的行为意味着任何事情都可能发生,包括获得正常的,一致的结果 这是未定义行为如此糟糕的原因之一; 当你编写一个程序时,你甚至可能都没注意到它,但是在某些其他情况下你的程序可能会发生灾难性的失败. (2认同)