破坏空指针时访问冲突

时间:2011-08-15 07:55:33

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

我遇到的问题是,当我的类CLimb运行其析构函数时,如果成员*parentNULL,我会收到“访问冲突写入位置0xcccccccc”错误,在调用析构函数之后,但在执行正文之前。

limb.h

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

    float cut;
    float bone;
    float resistance;

    CLimb *parent;
};

limb.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个实例,limb01limb02,其中limb02limb01的父级,如果limb02被删除{ {1}}现在指向错误的地址。我该如何解决这个问题?我是否还必须添加limb01->parent指针?

2 个答案:

答案 0 :(得分:2)

智能指针是一种解决方案。特别是,你可以在这里使用弱指针。当指向对象的引用计数降为零时(即,当它被删除时),弱指针会自动复位。

答案 1 :(得分:1)

我认为您的问题是您在删除指针后正在访问指针。因此,您需要跟踪哪些指针指向有效对象,哪些指针指向死对象。

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

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

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

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