Shared_ptr Утверждение px != 0 не удалось

У меня есть довольно сложное многопоточное приложение (сервер), которое время от времени падает из-за утверждения:

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


person Horacio    schedule 22.08.2010    source источник
comment
ошибки многопоточности трудно определить. Поскольку вы используете Linux, нет причин не использовать valgrind — это очень поможет вам найти ошибку.   -  person nos    schedule 22.08.2010
comment
Я широко использую valgrind и получаю ноль ошибок (с memcheck) до тех пор, пока не произойдет утверждение. Я все еще учусь интерпретировать сообщения об ошибках drd, так как большинство из них (конфликт загрузки/сохранения логических/целочисленных типов) не представляют проблемы.   -  person Horacio    schedule 23.08.2010
comment
Просто столкнулся с этой проблемой в отладке и был вызван наблюдением за переменными, пытающимся получить доступ к неинициализированной, но общей переменной. Часы отладчика не содержали утверждения.   -  person Niki    schedule 16.05.2019


Ответы (3)


Не должно быть проблем с использованием 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, что приводит к хаосу. Это очень сложно решить, но в этом случае у вас будет ненулевой указатель. Это не то, что происходит с вами прямо сейчас.

person jdehaan    schedule 22.08.2010

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

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

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

С уважением, Джонни

person Jonny Dee    schedule 22.04.2011

Вот, чтобы возродить древний вопрос. Я только что нажал это, и это было из-за проблемы со временем. Я пытался использовать shared_ptr из одного потока до того, как закончил его инициализацию в другом.

Так что, если кто-то нажмет на это сообщение, проверьте свое время, чтобы убедиться, что ваш shared_ptr был инициализирован.

person Joseph Larson    schedule 22.02.2019