【问题标题】:Access violation on destruction of a null pointer销毁空指针时的访问冲突
【发布时间】:2011-08-15 07:55:33
【问题描述】:

我遇到的问题是,当我的类 CLimb 运行它的析构函数时,如果成员 *parent 是 NULL 我得到一个 “访问冲突写入位置 0xcccccccc” 错误,在析构函数之后调用,但在执行主体之前。

肢体.h

class CLimb
{
public:
    CLimb(void);
    CLimb(CLimb *_parent);
    ~CLimb(void);

    float cut;
    float bone;
    float resistance;

    CLimb *parent;
};

肢体.cpp

#include "limb.h"


CLimb::CLimb(void) :
    cut(0),
    bone(0),
    resistance(0)
{
    parent = NULL;
}

CLimb::CLimb(CLimb *_parent) :
    cut(0),
    bone(0),
    resistance(0)
{
    parent = _parent;
}

CLimb::~CLimb(void)
{
}

我还想知道我是否有 2 个实例 limb01 和 limb02,其中 limb02 是 limb01 的父级,如果 limb02 被删除 limb01->parent 现在指向不正确的地址。我将如何解决这个问题?我还需要添加一个*child 指针吗?

【问题讨论】:

  • 问题可能出在其他地方:您既没有在提供的任何代码中分配、释放或使用parent 指针。 CLimb 所写的析构函数根本不会触及该指针。
  • 显示创建和删除对象的代码。

标签: c++ destructor access-violation null-pointer


【解决方案1】:

智能指针是一种解决方案。特别是,您可以在此处使用弱指针。当指向对象的引用计数降至零(即被删除时)时,弱指针会自动重置。

【讨论】:

    【解决方案2】:

    我假设您的问题是您在删除指针后访问它。所以你需要跟踪哪些指针指向有效对象,哪些指向死对象。

    有几种方法可以或多或少地自动解决此类问题。

    一种流行的方法是使用某种智能指针,例如shared_ptr。这将确保如果仍然存在对它的引用,则不会删除对象。

    另一种方法是建立层次结构:让每个父级控制其子级的生命周期。这意味着(1)需要在父级的析构函数中删除子级,以及(2)除了父级之外,没有人应该保留指向子级的指针(至少,很长时间)。

    另一种流行的方法是使用垃圾回收,但我不建议在非托管环境中使用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-16
      • 2013-11-02
      • 2017-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-27
      相关资源
      最近更新 更多