我有一个相当复杂的多线程应用程序(服务器),由于断言而不时会崩溃:
/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)。
答案 0 :(得分:35)
只要正确初始化共享指针并对所有共享对象库使用相同的内存管理上下文,使用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
的模块导致混乱,还有其他问题。这很难解决,但在这种情况下你会有一个非零指针。这不是你现在发生的事情。
答案 1 :(得分:3)
答案 2 :(得分:0)
这里是要重提一个古老的问题。我刚遇到这个问题,这是由于时间问题。我试图从一个线程使用shared_ptr,然后再在另一个线程中完成初始化。
因此,如果有人点击以上消息,请检查您的时间以确保您的shared_ptr已初始化。