Std::unordered_map vector下标超出范围

std::unordered_map vector subscript out of range

本文关键字:范围 下标 map unordered Std vector      更新时间:2023-10-16

我使用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(它是一个静态类成员)。

这会导致未定义的行为(访问未初始化的对象),导致应用程序崩溃并产生运行时错误。

如何解决静态初始化顺序问题可以在这里找到。