Как освободить структуру с массивами указателей на эти структуры внутри в C ++? - PullRequest
0 голосов
/ 01 ноября 2011

Это структура:

struct Node {
    Node *nodes[MAX]
};

Итак, внутри структуры у нас есть массив указателей на большее количество структур Node и т. Д.

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

Node *full = new Node();
Node *another = new Node();
full->nodes[30] = another;

Все остальные указатели установлены в NULL.

Поскольку я нигде не использовал new [], мне не нужно использовать delete [], верно?

Ответы [ 2 ]

3 голосов
/ 01 ноября 2011

Embrace C ++.Вы никогда не должны иметь дело с пустыми массивами ни в чем, кроме кода самого низкого уровня.(Как только вы это узнаете, загляните в шаблонный класс smart_ptr и посмотрите, как это можно еще больше упростить.)

class Node {
public:
    std::vector<Node*> nodes;
    Node() { nodes.resize(MAX); }
    ~Node() { 
       for (std::vector<Node*>::iterator it = nodes.begin(), end = nodes.end(); it != end; ++it) {
           delete *it;
       }
    }
};
3 голосов
/ 01 ноября 2011

Вы можете добавить конструктор и деструктор в вашу Node struct:

struct Node {
    Node *nodes[MAX];
    Node()
    {
        for (int i = 0; i < MAX; i++)
            nodes[i] = 0;
    }
    ~Node()
    {
        for (int i = 0; i < MAX; i++)
            delete nodes[i];
    }
private:
    // disable copies/assignments
    Node(const Node&);
    Node& operator=(const Node&);
};

Так что теперь вам просто нужно удалить корневой узел, и все дочерние элементы будут рекурсивно удалены одновременно.Обратите внимание, что конструктор предназначен для обнуления массива.Вы не хотите в конечном итоге вызывать удаление в неинициализированной памяти!Также обратите внимание, что вызов delete для NULL является допустимой операцией, которая ничего не делает (если вы используете стандартный распределитель).

РЕДАКТИРОВАТЬ: даже если вы говорите в комментариях, что вам все равно, это может быть хорошоИдея отключить копии и присваивания в вашей структуре, как я сделал выше.Это не позволит вам выстрелить себе в ногу и дважды удалить одну и ту же память.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...