unordered_map 在使用 [] 运算符时报告“向量下标超出范围”断言

Posted

技术标签:

【中文标题】unordered_map 在使用 [] 运算符时报告“向量下标超出范围”断言【英文标题】:unordered_map reports "vector subscript out of range" assertion when using [] operator 【发布时间】:2018-02-01 21:22:57 【问题描述】:

这是一个奇怪的问题。我有一个结构映射的映射。尝试插入一个元素会给我一个 std::vector 中的静态断言,它读取“向量下标超出范围”

这是我的定义:

class A 
  struct tag_info_t 
    uint8_t x, y, z;
  
  using tag_info_map = std::unordered_map<uint16_T, tag_info_t>;
  std::unordered_map<uint16_t, tag_info_map> id_to_poller_to_info_map;

  void foo(uint16_t, uint16_t, tag_info&);

我在线程中有一个循环执行这样的插入:

void A::foo(uint16_t tag, uint16_t poller, tag_info& info ) 
  id_to_poller_to_info_map[tag][poller] = info;

有时(而不是每次)我会在这一点上达到这个断言!我很想知道为什么会发生这种情况的一些信息。真是令人沮丧。我正在使用 MSVC140 (VS2015)。谢谢!

【问题讨论】:

请提供minimal reproducible example。 我在尝试重现时发现了我的问题。原来我忘了命名我的 lock_guards,所以构造函数会被调用,但它们会立即被丢弃。我的线程会相互竞争并破坏地图的内部结构。 @Michael Heh,可悲的是,我已经这样做了很多次了。 【参考方案1】:

由于您提到了线程,并且它只发生的事实有时暗示这是一个并发问题。 unordered_map 不是线程安全的,您不能同时从多个线程修改同一个实例。 从多个线程读取它很好。

如前所述,尝试提供一个完整的示例,以便我们更好地了解正在发生的事情。

【讨论】:

这个答案最准确

以上是关于unordered_map 在使用 [] 运算符时报告“向量下标超出范围”断言的主要内容,如果未能解决你的问题,请参考以下文章

尝试打印 unordered_map

unordered_map 在使用 [] 运算符时报告“向量下标超出范围”断言

C++ - unordered_map 运算符 [],意外行为

unordered_map 似乎没有返回对 [] 运算符的引用

unordered_map 段错误

c++ stl unordered_map 如何打印其所有值?