gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 00:48:36 24 4
gpt4 key购买 nike

我有以下应用程序结构:

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com