Эта часть :
new int;
Распределяет память для int
, что впоследствии будет удалено.Расположение этой памяти является значением указателя.Вы можете иметь любое количество указателей, указывающих на эту память, все указатели будут иметь одинаковое значение.Когда эта память удалена, значение указателей остается прежним, вы просто не должны разыменовывать указатели, потому что они теперь указывают на удаленную память
#include <iostream>
int main() {
int* ptr1 = new int;
int* ptr2 = ptr1;
// When I ran this the output was: 0x7fe835402a40 0x7fe835402a40
std::cout << ptr1 << ' ' << ptr2 << std::endl;
delete ptr1;
// Output is still: 0x7fe835402a40 0x7fe835402a40
std::cout << ptr1 << ' ' << ptr2 << std::endl;
return 0;
}
Что касается вашего второго вопроса, вы не удаляете указатели,Вы удаляете память, на которую они указывают.Если у более поздних узлов есть память, которую вы хотите освободить, тогда да, вам придется рекурсивно удалять их