我有以下应用程序结构:
/// CLASS VIEW3D.h
class View3D;
typedef boost::shared_ptr<View3D> ViewSP;
class View3D
{
public:
View3D(void);
};
/// CLASS SCREENQUAD.h
class ScreenQuad
{
public:
ScreenQuad(ViewSP view);
~ScreenQuad(void);
protected:
ViewSP _viewSP;
};
/// CLASS VIEW3D.cpp
View3D::Init(ViewSP view)
{
_screenQuadSP=new ScreenQuad(view);
}
///类 SCREENQUAD.cpp
ScreenQuad::ScreenQuad(ViewSP view):
_viewSP(view)
{
assert(_viewSP);
}
现在,我将 A
类的引用以共享指针的形式传递给 B
类,并将其保存在全局变量 A_SP
中.当应用程序崩溃时,我得到了这个:
HEAP: Free Heap block 2837920 modified at 2837b5c after it was freed
在调试执行后我发现类 A
的析构函数被调用后,当类 B
的析构函数被执行时它会再次被调用。所以我的猜测是boost 尝试释放封装在 _A_ref
中的指针地址处的内存。
需要注意的是:销毁的顺序是先是A
类,然后是B
类。
我该如何绕过它? shared_ptr
不应该保持引用计数并且不触发已经释放的对象的析构函数吗?
最佳答案
您的代码仍然太不完整,无法显示问题,但我可以想到此类错误的一些常见原因。
您在某处显式
删除
您的 View3D 实例。不要那样做,shared_ptr
会。如果您不再需要该对象,您可以调用ptr.reset()
,这将减少其引用计数并在适当时将其删除。 (这会在shared_ptr
被销毁时自动发生,例如在您的ScreenQuad
析构函数中;在这种情况下,无需显式执行。)您不小心为同一个对象创建了多个引用计数器。从
View3D*
原始指针创建shared_ptr
的地方应该只有一个,即在创建对象的同一位置。在其他任何地方,您都必须从其他共享(或弱)指针创建共享指针。否则,您最终会得到多个引用计数器,并且每个引用计数器最终都会尝试删除该对象,即使它已经被释放。您为堆栈上的对象创建了一个
shared_ptr
。本质上,这与在堆栈分配的对象上调用delete
是同一个问题。
这可能会帮助您自己找到错误,否则您真的需要发布更多代码——据我所知,在您目前显示的代码片段中没有发生任何这种情况。
关于c++ - BOOST共享指针导致冗余引用删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15185591/