2010-08-22 93 views
29

我有一个相当复杂的多线程应用程序(服务器)不时会崩溃由于断言: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)。

+1

多线程错误很难查明。既然你在linux上,没有理由不使用valgrind--它会帮助你很大程度地发现错误。 – nos 2010-08-22 12:00:31

+0

我正在广泛使用valgrind,并且在断言发生之前我得到了零错误(使用memcheck)。我仍然在学习如何解释drd错误消息,因为它们中的大多数(布尔型/整型类型的冲突加载/存储)似乎不是问题。 – Horacio 2010-08-22 22:07:16

回答

33

只要您正确初始化共享指针并为所有共享对象库使用相同的内存管理上下文,使用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正在使用导致混乱。这是很难解决的,但在这种情况下,你将有一个非零指针。这不是你现在正在发生的事情。