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 ループが正しく出力される理由ですが、これは 2 番目の for ループの前に実行された場合に限られます。longが組み込まれているため、タイプと関係があると思いますがstring、これは何が起こっているのかを説明するのに十分ではありません。

このコードを理解するのを手伝ってください。ありがとう!

4

1 に答える 1

5

map_ptrコードには未定義の動作がmy_mapあります。}つまり、if. はのアドレスmap_ptr保持しますが、いずれにしてもの寿命には影響しません。my_mapmy_map

于 2013-02-26T16:41:49.930 に答える