2013-04-11 5 views
6

Używam std::unordered_map<void *, size_t> do przechowywania niektórych wartości i otrzymuję "wektor dolny poza zakresem" podczas dodawania nowej wartości. Używam programu Visual Studio 2012 i ślad błędu:std :: unordered_map wektor indeksu poza zakresem

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]); 
} 

gdzie _Vec jest pusty wektor i _Bucket jest hash wskaźnik (> 0). To samo dzieje się, gdy kluczem nie jest void *, ale uintptr_t. Czy jest to błąd VS, czy robię coś nie tak?

Uwaga: to pytanie jest związane z c++ unorderedmap vector subscript out of range - jest to ten sam problem, ale odpowiedź nie jest związane

+1

Gdzie jest kod, który próbuje dodać coś do tej mapy? – Chad

+0

'void * ScalableMemoryManager :: allocateAligned (size_t size, size_t alignment) { void * wskaźnik = scalable_aligned_malloc (rozmiar, wyrównanie); if (pointer == nullptr) throw bad_alloc(); mTotalAllocated + = rozmiar; mSizes.insert (SizeMap :: value_type (wskaźnik, rozmiar)); ++ mTotalAllocations; wskaźnik powrotu; } ' – krojew

+0

Czy' mSizes' jest przypadkiem globalnym lub statycznym członkiem klasy? –

Odpowiedz

1

Jest to dość stary pytanie i nie wiem, czy moja odpowiedź pasuje do pytania. Ale ponieważ nie otrzymaliśmy dodatkowych informacji z PO i wpadłem na ten sam błąd środowiska wykonawczego, publikuję moje rozwiązanie dla mojego konkretnego problemu. Może ktoś uzna to za przydatne.

W moim przypadku był to problem ze statycznym problemem inicjalizacji. Uzyskałem dostęp do unordered_map (który był statycznym członkiem klasy) przed zainicjowaniem statycznych elementów tej klasy.

To spowodowało niezdefiniowane zachowanie (dostęp do obiektów, które nie zostały zainicjalizowane), które spowodowało awarię aplikacji z błędem środowiska wykonawczego.

Jak rozwiązać problemy z kolejnością inicjalizacji statycznej, można znaleźć here.