Вы неправильно поняли, как работают указатели. Указатели являются переменными, как и любые другие, и их значение - адрес памяти Не больше и не меньше.
Эта строка:
Node* x = my_array[0];
Копирует адрес из my_array[0]
в новую переменную с именем x
. Хотя адрес один и тот же, x
и my_array[0]
- это не одно и то же. Это две разные переменные, содержащие один и тот же адрес.
Эта строка:
my_array[0] = new Node;
Повторно присваивает адрес my_array[0]
новому адресу выделенного кучи Node
объекта. Он перезаписывает старый адрес в my_array[0]
и, таким образом, теряет память, потому что адрес (и объект в нем) никогда не освобождались. Однако у вас все еще есть это в x
, так что вы все еще можете освободить его и предотвратить утечку.
Эта строка:
x = new Node;
делает то же самое, но вместо этого перезаписывает адрес, сохраненный в x
. Это может быть хорошо, хотя, потому что исходный адрес все еще находится в my_array[0]
(помните, x
была просто копией этого адреса) и может быть освобожден позже. Также вы также можете освободить новый адрес в x
. Так что второй может тоже не протечь.
Я настоятельно рекомендую вам посмотреть POINTERS от TheCherno. Это отличное и простое объяснение.