2013-04-11 19 views
6

Sto utilizzando std::unordered_map<void *, size_t> per contenere alcuni valori e sto ottenendo "indice vettoriale fuori intervallo" quando si aggiunge un nuovo valore. Sto usando Visual Studio 2012 e la traccia di errore è:std :: unordered_map vettore pedice nell'intervallo

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

specificatamente:

_Unchecked_iterator& _Vec_lo(size_type _Bucket) 
{ // return reference to begin() for _Bucket 
return (_Vec[2 * _Bucket]); 
} 

dove _Vec è un vettore vuoto e _Bucket è l'hash puntatore (> 0). La stessa cosa accade quando il tipo di chiave non è nullo *, ma uintptr_t. È un bug VS o sto facendo qualcosa di sbagliato?

Nota: questa domanda è legata alla c++ unorderedmap vector subscript out of range - questo è lo stesso problema, ma la risposta non è legato

+1

Quindi, dov'è il codice che tenta effettivamente di aggiungere qualcosa a questa mappa? – Chad

+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; puntatore di ritorno; } ' – krojew

+0

È' mSizes' per caso un membro di classe globale o statico? –

risposta

1

E 'una domanda piuttosto vecchio e non so se la mia risposta si adatta alla domanda. Ma dal momento che non abbiamo ricevuto ulteriori informazioni dall'OP e mi sono imbattuto nello stesso errore di runtime, sto postando la mia soluzione al mio problema specifico. Forse qualcuno lo trova utile anche.

Nel mio caso si trattava di un problema di ordine di inizializzazione statico. Ho effettuato l'accesso allo unordered_map (che era un membro di classe statico) prima dell'inizializzazione dei membri statici di quella classe.

Che ha provocato un comportamento non definito (accesso a oggetti non inizializzati) che ha causato il crash dell'applicazione con tale errore di runtime.

Come risolvere i problemi di ordine di inizializzazione statici è possibile trovare here.

Problemi correlati