下面代码的行为让我感到惊讶:
map<string,long>* map_ptr;
if(true){
map<string, long> my_map;
my_map["a"] = 1;
my_map["b"] = 2;
my_map["c"] = 3;
map_ptr = &my_map;
}
//works ONLY IF this for loop comes before the next for loop
for(map<string, long>::iterator itr = map_ptr->begin(); itr != map_ptr->end(); ++itr)
cout << itr->second << endl;
// does not work prints random bits
for(map<string, long>::iterator itr = map_ptr->begin(); itr != map_ptr->end(); ++itr)
cout << itr->first << endl;
我知道在 if 语句中创建的变量仅在其中具有作用域,但我认为声明指向它们的指针会起作用。我对这段代码的堆栈结构了解有限,但我认为变量虽然超出了范围,但仍然在堆栈上,所以它们仍然存在。但似乎发生的事情比我所知道的要多。最让我惊讶的是为什么第一个 for 循环可以正确打印出东西,但前提是它是在第二个 for 循环之前执行的。我想这与类型有关,因为long
它是内置的,而 asstring
不是,但这远远不足以解释正在发生的事情。
请帮助我理解这段代码。谢谢!