0

次のコードを実行すると、「find()」呼び出しで segfault が発生します。

#include <vector>
#include <unordered_map>

struct item {
    std::unordered_map<int,int> map;
};

int main(int argc, char** argv) {
   std::vector<item> stack;
   stack.emplace_back();
   std::unordered_map<int,int>& topmap=stack.back().map;
   stack.emplace_back();
   auto ind=topmap.find(5);
   if(ind!=topmap.end()) {
      printf("Found element five in second to top item\n");
   }
}

(-std=c++11 でコンパイル)

ただし、2 番目の emplace_back() 呼び出しが削除された場合、segfault は発生しません。

どうしてこれなの?参照変数を間違って使用していますか? 別の要素をスタックに追加するとトップマップが無効になりますか?

4

3 に答える 3

3

最も可能性の高い説明は、 の 2 番目の呼び出しがemplace_back再割り当てを引き起こし、 を無効にすることtopmapです。これは、 を参照すると簡単に確認できますstack.capacity()。それが呼び出し間で変化する場合は、再割り当てが行われています。

于 2014-07-30T20:18:11.977 に答える