0

我遇到的问题是,当我的类 CLimb 运行其析构函数时,如果成员*parentNULL我在调用析构函数之后但在执行主体之前收到“访问冲突写入位置 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并且, if的父级limb02在哪里被删除,现在指向一个不正确的地址。我将如何解决这个问题?我还必须添加一个指针吗?limb02limb01limb02limb01->parent*child

4

2 回答 2

2

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

于 2011-08-15T08:05:44.370 回答
1

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

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

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

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

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

于 2011-08-15T08:03:18.053 回答