【问题标题】:std::unordered_map vector subscript out of rangestd::unordered_map 向量下标超出范围
【发布时间】:2013-04-04 03:38:24
【问题描述】:

我使用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 有关 - 这是同一个问题,但答案不相关

【问题讨论】:

  • 那么,实际尝试向此地图添加内容的代码在哪里?
  • 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; }
  • mSizes 是全局成员还是静态类成员?
  • 创建一个sscce。
  • 并且请不要为您自己的变量函数和类使用以_ 开头的名称。这些是保留的。

标签: c++ stl unordered-map


【解决方案1】:

这是一个很老的问题,我不知道我的答案是否适合这个问题。但是由于我们没有从 OP 获得更多信息并且我遇到了相同的运行时错误,所以我将针对我的具体问题发布我的解决方案。也许有人也觉得它有用。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多