我遇到的问题是,当我的类CLimb运行其析构函数时,如果成员*parent
为NULL
,我会收到“访问冲突写入位置0xcccccccc”错误,在调用析构函数之后,但在执行正文之前。
class CLimb
{
public:
CLimb(void);
CLimb(CLimb *_parent);
~CLimb(void);
float cut;
float bone;
float resistance;
CLimb *parent;
};
#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
被删除{ {1}}现在指向错误的地址。我该如何解决这个问题?我是否还必须添加limb01->parent
指针?
答案 0 :(得分:2)
智能指针是一种解决方案。特别是,你可以在这里使用弱指针。当指向对象的引用计数降为零时(即,当它被删除时),弱指针会自动复位。
答案 1 :(得分:1)
我认为您的问题是您在删除指针后正在访问指针。因此,您需要跟踪哪些指针指向有效对象,哪些指针指向死对象。
有几种方法可以或多或少地自动解决此类问题。
一种流行的方法是使用某种智能指针,例如shared_ptr
。这将确保如果仍有对象的引用,则不会删除该对象。
另一种方法是建立层次结构:让每个父控件控制其子级的生命周期。这意味着(1)孩子需要在父母的析构函数中被删除,并且(2)除了父母之外,没有人应该保留指向孩子的指针(至少在很长一段时间内)。
另一种流行的方法是使用垃圾收集,但我不建议在非托管环境中使用。