2013-02-26 56 views
0

代码的行为让我惊讶之内:C++指针变量,如果下面的语句

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不是,但这远远不足以解释发生了什么。

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

+1

一旦变量超出范围,*不要尝试访问它*!它已经不复存在了(尽管编译器可能还没有真正清理过它)。 – BoBTFish 2013-02-26 16:42:11

+1

未定义的行为。 – 0x499602D2 2013-02-26 16:42:55

+2

那里是关于酒店钥匙的文章... – 2013-02-26 16:45:08

回答

5

的代码是未定义行为,这意味着任何事情都有可能发生,包括出现的工作,为map_ptrmy_map将在if闭幕}遭到破坏悬空指针。 map_ptr将保留地址my_map,但这并不影响my_map的使用期限。