【问题标题】:BOOST shared pointer causes redundant reference deleteBOOST 共享指针导致冗余引用删除
【发布时间】: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:伪代码有伪错误。请发布真实代码。没有必要将每个人的时间浪费在不是问题的事情上。
  • 希望这看起来更好。

标签: c++ pointers boost


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 我怀疑这是我的问题:“您不小心为同一个对象创建了多个引用计数器。应该只有一个位置从 View3D* 原始指针创建 shared_ptr,即在同一个位置对象已创建。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多