我有一个相当复杂的多线程应用程序(服务器),不时会由于断言崩溃:
/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)。
解决方法
使用boost :: shared_ptr应该没有问题,只要正确初始化共享指针并对所有共享对象库使用相同的内存管理上下文即可。
在你的情况下,你试图使用一个未初始化的共享指针。
boost::shared_ptr<Obj> obj; obj->Something(); // assertion Failed boost::shared_ptr<Obj> obj(new Obj); obj->Something(); // ok
我建议尽可能在声明中初始化它们。异常处理可以创建许多“invisble”路径来运行代码,并且可能很难识别未初始化的共享指针。
PS:如果加载/卸载模块,其中shared_ptr正在使用导致混乱,还有其他问题。这很难解决,但在这种情况下,你会有一个非零指针。这不是你现在发生的事情。