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

C++ pointer to variable within if statement

本文关键字:C++ 指针 变量 if 语句 指向      更新时间:2023-10-16

下面代码的行为让我大吃一惊:

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是内置的,而string不是,但这远远不足以解释发生了什么

请帮助我理解此代码。谢谢

代码具有未定义的行为,这意味着任何事情都可能发生,包括看起来工作,因为map_ptr是一个悬挂指针,因为my_map将在if的结束}处被销毁。map_ptr将保留my_map地址,但这无论如何都不会影响my_map的寿命。