Куда делать память после удаления указателя?

Есть бинарное дерево. Каждый узел в нем - это такая структура:

struct TNode {
    int memory;
    TNode* left;
    TNode* right;
};

Инициализируется узел вот так:

Node* node = new Node;
node->memory = value;
node->left = NULL;
node->right = NULL;

То есть это число и два указателя на другие структуры-узлы. Отсюда у меня вопрос. Если я удалю узел оператором delete, то что будет с памятью, которую я выделил при инициализации оператором new? Указатель удалится, но будет ли дальше занимать место та память, которую я выделил через new? Или она автоматически станет "свободной", поскольку больше указателей на нее нет?


Ответы (1 шт):

Автор решения: こきん

При вызове оператора delete / delete[], с указателем ничего не происходит, т.е. если в нем был какой-то адрес, то он таким же и останется, если его не затереть вручную.

Т.е. например не присвоить NULL:

Node * pNode = new Node;
...
delete pNode;
pNode = NULL; // or nulltpr;

Но при этом важно понимать, что адрес на который он указывает — инвалидный.

Т.е. адрес памяти теперь вами больше не может использоваться, и если вы будете дальше его использовать, то либо вы получите SIGSEGV, либо ваша программа тут же упадет, или вам повезет и вы получите UB.

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

P.S. Если указатель лежит на стеке, то вам с ним ничего не нужно делать, т.к. он сам будет освобожден при утилизации стека, а если же он у вас в другой Node, то ничего страшного, просто перетрите его NULL / nullptr.

→ Ссылка