C++标准库中的unordered_map出现了向量下标越界问题

7

我正在使用std::unordered_map<void *, size_t>来存储一些值,当添加新值时,出现了“vector subscript out of range”的错误。我正在使用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 subscript out of range相关 - 这是相同的问题,但答案无关。


1
那么,实际上尝试向此地图添加内容的代码在哪里? - Chad
`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; return pointer; }` - krojew
2
制作一个 sscce - Peter Wood
请不要在您自己的变量、函数和类中使用以下划线开头的名称。这些名称已被保留。 - user995502
@user995502 这是不正确的。_Upperscore 是保留的,但 _underscore 是可以使用的。 - abergmeier
显示剩余6条评论
1个回答

2

这是一个相当老的问题,我不知道我的答案是否适用于该问题。但由于我们没有从OP那里得到其他信息,并且我遇到了相同的运行时错误,因此我将我的解决方案发布出来。也许有人会发现它有用。

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接