shared_ptr Утверждение px! = 0 не удалось - PullRequest
30 голосов
/ 22 августа 2010

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

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

Ответы [ 3 ]

36 голосов
/ 22 августа 2010

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

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

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

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

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

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

3 голосов
/ 23 апреля 2011

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

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

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

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

0 голосов
/ 22 февраля 2019

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

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

...