2010-08-22 7 views
29

Mam dość skomplikowany wielu gwintowany aplikacji (serwer), który od czasu do czasu katastrofy spowodowane assert:shared_ptr Twierdzenie px = 0 nie powiodło

/usr/include/boost/smart_ptr/shared_ptr.hpp:418: T* boost::shared_ptr< <template-parameter-1-1> >::operator->() const [with T = msg::Player]: Assertion `px != 0' failed. 

nie byłem w stanie określić przyczynę i był zastanawiasz się czy to jest problem z boost :: shared_ptr czy to ja?

Próbowałem g ++ 4.4.3-4ubuntu5 i llvm-g ++ (GCC) 4.2.1 z optymalizacją i bez optymalizacji oraz libboost1.40-dev (= 1.40.0-4ubuntu4).

+1

wielowątkowymi błędy są trudno wskazać. Ponieważ jesteś na Linuksie, nie ma powodu, aby nie używać Valgrind - pomoże ci to znacznie znaleźć błąd. – nos

+0

Używam valgrind obszernie i otrzymuję błędy zera (z memcheck) aż do wystąpienia assert. Nadal uczę się interpretować komunikaty o błędach drd, ponieważ większość z nich (obciążenie konfliktem/przechowywanie w typach boolean/integer) nie wydaje się problemem. – Horacio

Odpowiedz

33

Nie powinno być problemu z używaniem boost::shared_ptr, o ile poprawnie zainicjalizujesz swoje współdzielone wskaźniki i użyjesz tego samego kontekstu zarządzania pamięcią dla wszystkich bibliotek obiektów współdzielonych.

W twoim przypadku próbujesz użyć niezainicjowanej wspólny wskaźnik.

boost::shared_ptr<Obj> obj; 
obj->Something(); // assertion failed 

boost::shared_ptr<Obj> obj(new Obj); 
obj->Something(); // ok 

Zaleca się zainicjować je po złożeniu oświadczenia, gdy tylko jest to możliwe. obsługa wyjątków można utworzyć wiele „invisble” ścieżek na uruchomienie kodu i może to być dość trudne do zidentyfikowania niż zainicjowane wspólnych wskaźników.

PS: Są też inne problemy, jeśli załadunku/rozładunku modułów gdzie shared_ptr są w użyciu prowadzącej do chaosu. Jest to bardzo trudne do rozwiązania, ale w tym przypadku masz niezerowy wskaźnik. To nie dzieje się teraz z tobą.

3

może chcesz się upewnić, że

zawsze używać nazwie zmiennej inteligentny wskaźnik trzymać wynik nowej

jak to jest tutaj zalecane: boost::shared_ptr - Best Practices

Pozdrowienia, Jonny