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

标签 c++ pointers boost

我有以下应用程序结构:

/// 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 不应该保持引用计数并且不触发已经释放的对象的析构函数吗?

最佳答案

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

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

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

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

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

关于c++ - BOOST共享指针导致冗余引用删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15185591/

相关文章:

c++ - 为什么这个返回类型不起作用? (C++)

c++ - 代码工作正常,但我无法理解它打印的内容

C# 在字典中存储函数

c++ - 为什么在离开属于该类的私有(private)函数的范围时调用我的类的析构函数?

c++ - 设置种子 boost::随机

c++ - Boost::ASIO 和 std::packaged_task

c++ - Arduino 如何使用 ESP2668 创建 wifi 接入点?

C:向动态分配的数组添加元素

c++ - boost.mpi 中的自定义 reduce 操作

c++ - 使用 STL 算法在表( vector 的 vector ,二维数组)中查找最小值/最大值的优雅方法