2013-04-11 130 views
6

我使用std::unordered_map<void *, size_t>来保存一些值,并在添加新值时收到“向量下标超出范围”。我使用Visual Studio 2012和错误跟踪是:std :: unordered_map向量下标超出范围

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++ 

specificaly:

_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 - 这是同样的问题,但答案是没有关系的

+1

那么,实际上试图向该地图添加内容的代码在哪里? – Chad 2013-04-11 19:35:39

+0

void * ScalableMemoryManager :: allocateAligned(size_t size,size_t alignment) void * pointer = scalable_aligned_malloc(size,alignment); if(pointer == nullptr) throw bad_alloc(); mTotalAllocated + = size; mSizes.insert(SizeMap :: value_type(pointer,size)); ++ mTotalAllocations; 返回指针; }' – krojew 2013-04-11 19:37:26

+0

是否有'mSizes'全局或静态类成员? – 2013-04-11 19:38:59

回答

1

这是一个很老的问题,如果我的回答适合的问题,我不知道。但是由于我们没有从OP得到额外的信息,并且遇到了相同的运行时错误,我将我的解决方案发布到我的特定问题上。也许有人认为它也很有用。

在我的情况下,这是一个静态的初始化顺序问题。我在该类的静态成员初始化之前访问了unordered_map(这是一个静态类成员)。

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

如何解决静态初始化的顺序问题可以找到here