我有以下app结构:
/// 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);
}
/// CLASS 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
的析构函数时,它会再次被调用。所以我的猜测是增强试图释放封装在_A_ref
中的指针地址的内存。
需要注意的是:破坏的顺序首先是A
类,然后是B
类。
我如何解决这个问题?不应该shared_ptr
保持引用计数而不是触发已经释放的对象的析构函数?
答案 0 :(得分:3)
您的代码仍然太不完整,显示问题,但我可以想到导致此类错误的一些常见原因。
您在某处明确地delete
了View3D实例。不要这样做,shared_ptr
会。如果您不再需要该对象,则可以调用ptr.reset()
,这将减少其引用计数并在适当时删除它。 (这会在shared_ptr
被销毁时自动发生,例如在您的ScreenQuad
析构函数中;在这种情况下,无需明确地执行此操作。)
您不小心为同一个对象创建了多个引用计数器。应该只有一个位置从shared_ptr
原始指针创建View3D*
,即在创建对象的同一位置。在其他地方,您必须从其他共享(或弱)指针创建共享指针。否则你最终将得到多个引用计数器,并且每个引用计数器最终都会尝试删除该对象,即使它已经被释放。
您为堆栈中的对象创建了shared_ptr
。从本质上讲,这与在堆栈分配的对象上调用delete
的问题相同。
这可能会帮助您自己发现错误,否则您确实需要发布更多代码 - 据我所知,到目前为止您所显示的代码段中没有发生任何相关内容。