c++ 11在vector中引用unordered_map时出现段错误

C++11 segfault on reference to unordered_map in vector

本文关键字:段错误 错误 map vector 引用 unordered c++      更新时间:2023-10-16

当我运行以下代码时,我在'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 itemn");
   }
}

(使用-std=c++11编译)

但是,如果第二个emplace_back()调用被删除,则没有段错误。

为什么会这样?我是否使用了错误的引用变量?向栈中添加另一个元素会使topmap失效吗?

最可能的解释是对emplace_back的第二次调用导致重新分配,使topmap无效。你可以很容易地通过查看stack.capacity()来检查这一点。如果在调用之间发生了变化,则存在重新分配

如果你阅读例如这个参考,你会看到文本

如果新的size()大于capacity(),则所有迭代器和引用(包括过端迭代器)无效。"

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

向栈中添加另一个元素会使topmap失效吗?

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

如果new size()大于capacity(),则所有迭代器和引用(包括过端迭代器)无效。否则,只有过末端迭代器失效。