BOOST共享指针导致冗余引用删除

时间:2013-03-03 12:22:14

标签: c++ pointers boost

我有以下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保持引用计数而不是触发已经释放的对象的析构函数?

1 个答案:

答案 0 :(得分:3)

您的代码仍然太不完整,显示问题,但我可以想到导致此类错误的一些常见原因。

  • 您在某处明确地delete了View3D实例。不要这样做,shared_ptr会。如果您不再需要该对象,则可以调用ptr.reset(),这将减少其引用计数并在适当时删除它。 (这会在shared_ptr被销毁时自动发生,例如在您的ScreenQuad析构函数中;在这种情况下,无需明确地执行此操作。)

  • 您不小心为同一个对象创建了多个引用计数器。应该只有一个位置从shared_ptr原始指针创建View3D*,即在创建对象的同一位置。在其他地方,您必须从其他共享(或弱)指针创建共享指针。否则你最终将得到多个引用计数器,并且每个引用计数器最终都会尝试删除该对象,即使它已经被释放。

  • 您为堆栈中的对象创建了shared_ptr。从本质上讲,这与在堆栈分配的对象上调用delete的问题相同。

这可能会帮助您自己发现错误,否则您确实需要发布更多代码 - 据我所知,到目前为止您所显示的代码段中没有发生任何相关内容。