Нарушение прав доступа при уничтожении нулевого указателя - PullRequest
0 голосов
/ 15 августа 2011

Проблема, с которой я сталкиваюсь, заключается в том, что когда мой класс CLimb запускает свой деструктор, если член *parent равен NULL, я получаю "Ошибка записи местоположения 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 экземпляра, limb01 и limb02, где limb02 является родителем limb01, если limb02 удалено limb01->parent теперь указывает на неправильный адрес.Как бы я решить это?Должен ли я добавить указатель *child?

Ответы [ 2 ]

2 голосов
/ 15 августа 2011

Умные указатели являются решением. В частности, вы можете использовать слабый указатель здесь. Слабый указатель автоматически сбрасывается, когда счетчик ссылок на объект, на который указывает указатель, падает до нуля (то есть, когда он удаляется).

1 голос
/ 15 августа 2011

Полагаю, ваша проблема в том, что вы обращаетесь к указателю после его удаления.Поэтому вам необходимо отслеживать, какие указатели указывают на действительные объекты, а какие на мертвые.

Существует несколько способов более или менее автоматического решения таких проблем.

Популярным может бытьиспользуя какие-то умные указатели, например, shared_ptr.Это гарантирует, что объект не будет удален, если на него все еще есть ссылки.

Другой подход - установить иерархию: заставить каждого родителя контролировать время жизни своих потомков.Это означает, что (1) дочерние элементы должны быть удалены в деструкторе родителя, и (2) никто, кроме родителя, не должен хранить указатель на дочернего элемента (по крайней мере, в течение длительного времени).

Покадругим популярным подходом будет использование сборки мусора, но я бы не рекомендовал его в неуправляемых средах.

...