0

我有以下应用程序结构:

/// 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);

}

现在,我将类的引用以共享指针的形式传递给AB,并将其保存在全局变量A_SP中。当应用程序关闭时,我得到了这个:

HEAP:   Free Heap block 2837920 modified at 2837b5c after it was freed

调试执行后我发现类A析构函数被调用后,当类的析构函数B被执行时,它会再次被调用。所以我的猜测是boost试图释放封装在指针地址处的内存_A_ref。只是要注意:销毁的顺序是A先类,然后是B类。

我该如何解决?不应该shared_ptr保持引用计数并且不触发已经释放的对象的析构函数吗?

4

1 回答 1

3

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

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

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

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

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

于 2013-03-03T13:41:06.347 回答