36

我有一个相当复杂的多线程应用程序(服务器),有时会由于断言而崩溃:

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

4

3 回答 3

41

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(资源获取即初始化)

于 2010-08-22T11:55:45.950 回答
3

你可能想确保你

始终使用命名的智能指针变量来保存 new 的结果

就像这里推荐的那样:boost::shared_ptr - 最佳实践

问候,强尼

于 2011-04-22T20:40:19.443 回答
0

这是为了恢复一个古老的问题。我刚刚打了这个,这是由于时间问题。在我在另一个线程中完成初始化之前,我试图从一个线程中使用 shared_ptr。

因此,如果有人点击上述消息,请检查您的时间以确保您的 shared_ptr 已初始化。

于 2019-02-22T20:34:26.740 回答