std :: unordered_map向量下标超出范围
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了std :: unordered_map向量下标超出范围相关的知识,希望对你有一定的参考价值。
我正在使用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错误还是我做错了什么?
注意:这个问题与c++ unorderedmap vector subscript out of range有关 - 这是同样的问题,但答案是无关紧要的
答案
这是一个非常古老的问题,我不知道我的答案是否适合这个问题。但是由于我们没有从OP获得额外的信息而且我遇到了相同的运行时错误,我将解决方案发布到我的具体问题。也许有人觉得它很有用。
在我的例子中,这是一个静态初始化顺序问题。我在初始化该类的静态成员之前访问了unordered_map
(它是一个静态类成员)。
这导致了未定义的行为(访问未初始化的对象),这会使应用程序因运行时错误而崩溃。
如何解决静态初始化顺序问题可以找到here。
以上是关于std :: unordered_map向量下标超出范围的主要内容,如果未能解决你的问题,请参考以下文章