私は次のアプリ構造を持っています:
/// 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
。したがって、ブーストは、にカプセル化されたポインタのアドレスでメモリを解放しようとしていると思います_A_ref
。注意点:破壊の順序は、A
最初にクラス、次にB
クラスです。
どうすれば回避できますか?shared_ptr
refカウントを保持し、すでにリリースされているオブジェクトのデストラクタをトリガーしないようにする必要がありますか?