0

下面代码的行为让我感到惊讶:

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不是,但这远远不足以解释正在发生的事情。

请帮助我理解这段代码。谢谢!

4

1 回答 1

5

代码具有未定义的行为,这意味着任何事情都可能发生,包括看起来可以工作,就像map_ptr悬空指针一样,my_map它将}if. 将map_ptr保留的地址my_map但这my_map无论如何都不会影响的生命周期。

于 2013-02-26T16:41:49.930 回答