2010-08-22 3 views
29

У меня есть довольно сложное многопоточное приложение (сервер), который время от времени будет врезаться в связи с утверждаете:shared_ptr Assertion рх =-не удался

/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. 

Я был не в состоянии определить причину и был интересно, если это проблема с boost :: shared_ptr, или это я?

Я пробовал g ++ 4.4.3-4ubuntu5 и llvm-g ++ (GCC) 4.2.1 с оптимизацией и без оптимизации и libboost1.40-dev (= 1.40.0-4ubuntu4).

+1

Многопоточные ошибки трудно определить. Поскольку вы работаете в Linux, нет причин не использовать valgrind - это поможет вам найти ошибку. – nos

+0

Я использую valgrind экстенсивно и получаю нулевые ошибки (с memcheck) до тех пор, пока не произойдет утверждение. Я все еще изучаю, как интерпретировать сообщения об ошибках drd, поскольку большинство из них (конфликтная загрузка/сохранение по логическим/целочисленным типам), похоже, не проблема. – Horacio

ответ

33

Не должно быть проблем с использованием boost::shared_ptr, если вы правильно инициализируете свои общие указатели и используете один и тот же контекст управления памятью для всех ваших общих библиотек объектов.

В вашем случае вы пытаетесь использовать неинициализированный общий указатель.

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

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

Я бы посоветовал инициализировать их прямо по декларации, когда это возможно. Обработка исключений может создать множество «невидимых» путей для запуска кода, и может быть довольно сложно идентифицировать неинициализированные общие указатели.

PS: Существуют другие проблемы, если вы загружаете/выгружаете модули, в которых используются shared_ptr, приводящие к хаосу. Это очень сложно решить, но в этом случае у вас будет ненулевой указатель. Это не то, что происходит с тобой сейчас.

3

вы можете убедиться, что вы

всегда использовать именованный переменную умный указатель для хранения результата нового

как рекомендуется здесь: boost::shared_ptr - Best Practices

С уважением, Jonny

Смежные вопросы