我有一个相当复杂的多线程应用程序(服务器),有时会由于断言而崩溃:
/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
我建议尽可能在声明时对它们进行初始化。异常处理可以为代码运行创建许多“不可见”的路径,并且可能很难识别未初始化的共享指针。PS:如果您加载/卸载模块,还有其他问题
shared_ptr
正在使用导致困惑。这很难解决,但在这种情况下,您将有一个非零指针。这不是你现在正在发生的事情。PPS:使用的模式称为 RAII (Resource Acquisition Is Initialization)
关于shared-ptr - shared_ptr 断言像素!= 0 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3541179/