C ++ 11段错误引用向量中的unordered_map

时间:2014-07-30 20:14:14

标签: c++ c++11 unordered-map emplace

当我运行以下代码时,我会在' find()'上得到一个段错误。调用

#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编译)

但是,如果删除了第二个emplace_back()调用,则不存在段错误。

这是为什么?我使用引用变量错了吗?向堆栈添加另一个元素会使topmap无效吗?

3 个答案:

答案 0 :(得分:3)

最可能的解释是,对emplace_back的第二次调用导致重新分配,使topmap无效。您可以通过查看stack.capacity()轻松查看此内容。如果在不同呼叫之间发生变化,则会进行重新分配。

答案 1 :(得分:2)

如果您阅读例如this reference,您会看到文字

  

如果新的size()大于capacity(),则所有迭代器和引用(包括过去的迭代器)都将失效。&#34;

在向量的末尾添加新项通常会重新分配向量中的数据并导致此行为。更具体地说,由于map是结构内部的普通实例,因此它也将被重新分配。

答案 2 :(得分:1)

  

在堆栈中添加另一个元素会使topmap无效吗?

不是强制性的,但可以。这取决于调用std::vector::emplace_back()时是否发生了重新分配。 std::vector::emplace_back documentation:

  

如果新的size()大于capacity()那么所有的迭代器和   引用(包括过去的结束迭代器)无效。   否则只有过去的迭代器无效。