Куда делать память после удаления указателя?
Есть бинарное дерево. Каждый узел в нем - это такая структура:
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.