Подтвердить что ты не робот

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

4b9b3361

Ответ 1

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

Ответ 2

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

всегда используйте названную интеллектуальную переменную-указатель, чтобы удерживать результат нового

как это рекомендуется здесь: boost:: shared_ptr - лучшие практики

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