0

当我运行以下代码时,我在“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 无效?

4

3 回答 3

3

最可能的解释是第二次调用emplace_back导致重新分配,使topmap. 您可以通过查看来轻松检查stack.capacity()。如果在调用之间发生变化,则进行了重新分配。

于 2014-07-30T20:18:11.977 回答
2

如果您阅读例如this reference,您将看到文本

如果 newsize()大于,capacity()则所有迭代器和引用(包括过去的迭代器)都将无效。”

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

于 2014-07-30T20:22:42.050 回答
1

向堆栈中添加另一个元素是否会使 topmap 无效?

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

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

于 2014-07-30T20:21:03.657 回答