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 在使用 [] 运算符时报告“向量下标超出范围”断言
C++ - unordered_map 运算符 [],意外行为