Индекс вектора 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 или я что-то не так делаю?

Примечание: этот вопрос связан с индексом вектора unorderedmap С++ вне диапазона - это та же проблема, но ответ не связан


person krojew    schedule 11.04.2013    source источник
comment
Так где же код, который на самом деле пытается что-то добавить на эту карту?   -  person Chad    schedule 11.04.2013
comment
Является ли mSizes случайно глобальным или статическим членом класса?   -  person Mark B    schedule 11.04.2013
comment
Создайте sscce.   -  person Peter Wood    schedule 11.04.2013
comment
И, пожалуйста, не используйте имена, начинающиеся с _, для ваших собственных функций переменных и классов. Они зарезервированы.   -  person    schedule 11.04.2013
comment
@MarkB нет, это локально для экземпляра класса   -  person krojew    schedule 11.04.2013
comment
@stardust_ Я нигде не использую _name...   -  person krojew    schedule 11.04.2013
comment
Код стандартной библиотеки, которую вы цитировали, есть, но это совершенно законно.   -  person Ulrich Eckhardt    schedule 12.04.2013
comment
@MarkB: у меня тоже есть эта проблема. Один глобальный файл в A.cpp инициализируется функцией из B.cpp, и эта функция выполняет вставку в глобальную карту unordered_map также в B.cpp. Должно быть действительным, но происходит сбой с этой ошибкой.   -  person Mooing Duck    schedule 06.02.2015
comment
@ user995502 Это НЕ правда. _Upperscore зарезервированы, но _underscore в порядке.   -  person abergmeier    schedule 24.02.2016
comment
Код, который он публикует, взят из стандартной библиотеки, а не из его кода.   -  person Ólafur Waage    schedule 04.06.2019


Ответы (1)


Это довольно старый вопрос, и я не знаю, подходит ли мой ответ этому вопросу. Но поскольку мы не получили дополнительной информации от OP, и я столкнулся с той же ошибкой времени выполнения, я публикую свое решение для моей конкретной проблемы. Может кому тоже пригодится.

В моем случае это была проблема статического порядка инициализации. Я получил доступ к unordered_map (который был статическим членом класса) до инициализации статических членов этого класса.

Это привело к неопределенному поведению (доступ к объектам, которые не инициализированы), что привело к сбою приложения с этой ошибкой времени выполнения.

О том, как решить проблемы статического порядка инициализации, можно узнать здесь.

person Timo    schedule 02.03.2018