在if语句中指向变量的C++指针

use*_*088 0 c++ stack pointers

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

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; 
Run Code Online (Sandbox Code Playgroud)

我知道在if语句中创建的变量只包含其中的范围,但我认为声明指向它们的指针将起作用.我对这段代码的堆栈结构知之甚少,但我认为变量虽然超出了范围,但仍然存在于堆栈中,因此它们仍然存在.但似乎发生了比我所知更多的事情.让我感到惊讶的是,为什么第一个for循环打印出正确的东西,但只有在第二个for循环之前执行它.我想这与该类型有关,因为long它内置于string不存在的地方,但这远远不足以解释正在发生的事情.

请帮我理解这段代码.谢谢!

hmj*_*mjd 5

代码具有未定义的行为,这意味着任何事情都可能发生,包括出现在工作中,就像map_ptr悬挂指针一样,my_map会在关闭}时被破坏if.在map_ptr将保留地址my_map,但是这并不影响寿命my_map反正.