Mam następujących funkcji jako konstruktora dla klasy:C++ Mapa daje błąd Bus gdy próbuje ustawić wartość
template<typename T>
void Pointer<T>::Pointer(T* inPtr)
{
mPtr = inPtr;
if (sRefCountMap.find(mPtr) == sRefCountMap.end()) {
sRefCountMap[mPtr] = 1;
} else {
sRefCountMap[mPtr]++;
}
}
Oto definicja mapie:
static std::map<T*, int> sRefCountMap;
otrzymuję Błąd magistrali czasami, gdy ten kod jest uruchamiany:
#0 0x95110fc0 in std::_Rb_tree_decrement()
#1 0x00017ccc in std::_Rb_tree_iterator<std::pair<Language::Value* const, int> >::operator-- (this=0xbfffe014) at stl_tree.h:196
#2 0x0001b16c in std::_Rb_tree<Language::Value*, std::pair<Language::Value* const, int>, std::_Select1st<std::pair<Language::Value* const, int> >, std::less<Language::Value*>, std::allocator<std::pair<Language::Value* const, int> > >::insert_unique (this=0x2a404, [email protected]) at stl_tree.h:885
#3 0x0001b39c in std::_Rb_tree<Language::Value*, std::pair<Language::Value* const, int>, std::_Select1st<std::pair<Language::Value* const, int> >, std::less<Language::Value*>, std::allocator<std::pair<Language::Value* const, int> > >::insert_unique (this=0x2a404, __position={_M_node = 0x2a408}, [email protected]) at stl_tree.h:905
#4 0x0001b5a0 in __gnu_norm::map<Language::Value*, int, std::less<Language::Value*>, std::allocator<std::pair<Language::Value* const, int> > >::insert (this=0x2a404, position={_M_node = 0x2a408}, [email protected]) at stl_map.h:384
#5 0x0001b6e0 in __gnu_norm::map<Language::Value*, int, std::less<Language::Value*>, std::allocator<std::pair<Language::Value* const, int> > >::operator[] (this=0x2a404, [email protected]) at stl_map.h:339
Dzięki.
dlaczego nie po prostu zrobić sRefCountMap [mPtr] ++? Jeśli nie istnieje, zostanie uruchomione i uruchomione na 0 ... – Goz
Czy masz jakieś statyczne instancje 'Pointer'? Można je zbudować przed mapą. –
Czy ten program jest jednowątkowy, czy też kilka różnych wątków korzysta z sRefCountMap? Zastanawiam się, czy możemy wykluczyć błędy wątku. –