shared_ptr断言px!= 0失败

问题描述 投票:30回答:3

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

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

shared-ptr boost-thread
3个回答
36
投票

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


3
投票

你可能想确定你

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

喜欢这里推荐:boost::shared_ptr - Best Practices

问候,强尼


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.