2013-02-26 47 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的使用期限。