【问题标题】:C++11 segfault on reference to unordered_map in vector向量中引用 unordered_map 的 C++11 段错误
【发布时间】:2014-07-30 20:14:14
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 糟糕,这显然是解释。如果我希望我的引用保持有效,我应该使用 std::list 。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-13
        • 2014-10-29
        • 1970-01-01
        • 1970-01-01
        • 2014-08-18
        • 2021-01-22
        • 1970-01-01
        • 2020-07-10
        相关资源
        最近更新 更多