Как удалить указатель классов, которые имеют члены-указатели? - PullRequest
3 голосов
/ 29 февраля 2012

Я имею в виду, если у меня есть такой класс, как:

class A{
    int* pi;
};
*A pa;

когда я позвоню delete pa, pi будет удален?

Ответы [ 3 ]

10 голосов
/ 29 февраля 2012

Вам нужно определить деструктор для delete pi;.Кроме того, вам также необходимо определить конструктор копирования и оператор присваивания, в противном случае при копировании экземпляра A два объекта будут указывать на один и тот же int, который будет удален при уничтожении одного из экземпляров A.оставив другой экземпляр A с висящим указателем.

Например:

class A
{
public:
    // Constructor.
    A(int a_value) : pi(new int(a_value)) {}

    // Destructor.
    ~A() { delete pi; }

    // Copy constructor.
    A(const A& a_in): pi(new int(*a_in.pi)) {}

    // Assignment operator.
    A& operator=(const A& a_in)
    {
        if (this != &a_in)
        {
            *pi = *a_in.pi;
        }
        return *this;
    }
private:
    int* pi;
};
1 голос
/ 29 февраля 2012

Вы должны внедрить деструктор ~A(), который позаботится об очистке A вещей.После этого вызов delete для указателя типа A очистит все.

0 голосов
/ 29 февраля 2012

Вам потребуется написать деструктор для удаления всех членов типа указателя.Что-то вроде:

class A
{
    int *pi;
  public:
    ~A(){delete pi;}
};

Вам нужно убедиться, что ваш конструктор присваивает значение pi (по крайней мере, NULL).и, как и ответ от @hmjd, вам нужно будет реализовать или скрыть конструктор копирования и операторы присваивания.Ищите правило трех здесь: http://en.wikipedia.org/wiki/Rule_of_three_%28C%2B%2B_programming%29

...