【发布时间】:2013-03-03 12:22:14
【问题描述】:
我有以下应用结构:
/// 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 不应该保持引用计数并且不触发已经释放的对象的析构函数吗?
【问题讨论】:
-
您能否提供一个简短的可编译示例来重现您所描述的行为?
-
错的太多了:缺少分号,前导的下划线大写名称被保留...
-
好吧,这只是一个伪代码...
-
@MichaelIV:伪代码有伪错误。请发布真实代码。没有必要将每个人的时间浪费在不是问题的事情上。
-
希望这看起来更好。