std::multimap使用equal_range后遍历区间断言失败的可能原因是什么
std::multimap 断言偶现失败的触发场景
- 多线程数据竞争:尽管函数入参声明为
const std::multimap<int, const Foo*>&,仅限制当前函数无法通过该引用修改map,但不代表底层map对象是全局只读的。如果有其他线程在equal_range执行完成、到区间遍历执行的时间窗口内,删除了cell对应的所有键值对,或是插入/删除元素导致equal_range返回的迭代器失效,就会出现range.first != map.end()但range.first == range.second的情况,此时循环次数为0,触发断言。这是偶现问题最常见的诱因。 - 自定义比较器不符合严格弱序要求:如果你的
multimap使用了自定义的键比较函数,且该函数不满足C++标准规定的严格弱序规则,equal_range的行为属于未定义,完全可能返回首尾迭代器相等、但首迭代器不等于map.end()的非法区间。 - 内存非法访问:如果传入函数的
map是指向已销毁对象的悬空引用,或是程序其他位置存在野指针、缓冲区溢出等内存错误,破坏了multimap的内部数据结构,也会导致equal_range返回异常结果,触发未定义行为。
内容的提问来源于stack exchange,提问作者matthias_buehlmann
相关产品推荐
相关产品推荐

