Std::unordered_map vector下标超出范围
std::unordered_map vector subscript out of range
我使用std::unordered_map<void *, size_t>
来保存一些值,当添加新值时,我得到"矢量下标超出范围"。我使用的是Visual Studio 2012,错误跟踪是:
std::vector<std::_List_unchecked_iterator<std::_List_val<std::_List_simple_types<std::pair<void * const,unsigned int> > > >,std::_Wrap_alloc<std::allocator<std::_List_unchecked_iterator<std::_List_val<std::_List_simple_types<std::pair<void * const,unsigned int> > > > > > >::operator[](unsigned int _Pos) Line 1140 C++
std::_Hash<std::_Umap_traits<void *,unsigned int,std::_Uhash_compare<void *,std::hash<void *>,std::equal_to<void *> >,std::allocator<std::pair<void * const,unsigned int> >,0> >::_Vec_lo(unsigned int _Bucket) Line 907 C++
std::_Hash<std::_Umap_traits<void *,unsigned int,std::_Uhash_compare<void *,std::hash<void *>,std::equal_to<void *> >,std::allocator<std::pair<void * const,unsigned int> >,0> >::_End(unsigned int _Bucket) Line 936 C++
std::_Hash<std::_Umap_traits<void *,unsigned int,std::_Uhash_compare<void *,std::hash<void *>,std::equal_to<void *> >,std::allocator<std::pair<void * const,unsigned int> >,0> >::_Insert<std::pair<void * const,unsigned int>,std::_Nil>(std::pair<void * const,unsigned int> && _Val, std::_Nil _Pnode) Line 872 C++
std::_Hash<std::_Umap_traits<void *,unsigned int,std::_Uhash_compare<void *,std::hash<void *>,std::equal_to<void *> >,std::allocator<std::pair<void * const,unsigned int> >,0> >::insert(std::pair<void * const,unsigned int> && _Val) Line 371 C++
此次:
_Unchecked_iterator& _Vec_lo(size_type _Bucket)
{ // return reference to begin() for _Bucket
return (_Vec[2 * _Bucket]);
}
,其中_Vec是一个空向量,_Bucket是指针哈希值(> 0)。当键类型不是void *,而是uintptr_t时,也会发生同样的事情。这是一个VS bug还是我做错了什么?
注意:这个问题与c++ unorderedmap vector下标out of range有关——这是同样的问题,但答案与
这是一个相当老的问题,我不知道我的答案是否适合这个问题。但由于我们没有从OP得到额外的信息,我遇到了相同的运行时错误,我张贴我的解决方案,我的具体问题。也许有人也会觉得它很有用。
在我的例子中,这是一个静态初始化顺序问题。在初始化该类的静态成员之前,我访问了unordered_map
(它是一个静态类成员)。
这会导致未定义的行为(访问未初始化的对象),导致应用程序崩溃并产生运行时错误。
如何解决静态初始化顺序问题可以在这里找到。
相关文章:
- 尝试通过多个向量访问变量时,向量下标超出范围
- 矢量下标超出SFML游戏中的范围
- 运行时错误:矢量下标超出范围:正在检查空集
- 如果变量数据包含大于 vector 所有元素的整数,则仅在视觉工作室上接收"矢量下标超出范围"?
- 编译期间矢量下标超出范围
- C++ 调试断言失败 - 矢量下标超出视觉工作室的范围
- 对矢量来说是全新的.矢量下标超出范围
- C++十进制到十六进制(字符串下标超出范围)
- 创建结构体向量,表达式:向量下标超出范围
- 读取矢量时矢量下标超出范围
- 断言失败错误,C++中的矢量下标超出范围问题
- 如何在 Linux 上强制执行矢量下标超出范围的调试断言
- 表达式:矢量下标超出范围
- 矢量下标超出范围,带有嵌套的 for 循环
- 向量下标超出向量向量的范围
- gcc8.2如何启用警告:数组下标在数组范围之上[-warray-bounds]
- 向量下标出的范围错误.即使向量的索引大于访问数据的索引,也会发生误差
- std::vector<std::vector<int>>:调试断言失败。C++矢量下标超出范围保留内存
- 重命名两个目录中的文件名,如果它们之间的某些字符匹配 - 矢量下标超出范围
- 行进立方体重建 - 向量下标超出范围