Вы говорите, что в CODE2 вы создаете 2 локальные переменные.Хотя технически вы правы, я думаю, что есть некоторое недопонимание:
Глядя на строку
label* var1 = new label();
в вашем цикле: вы создаете локальную переменную, и данные в куче (память, которую вы выделяете через new label()
).Эта память остается там даже на следующей итерации.
Затем вы помещаете указатель на эту выделенную память в свой стек.Вы, вероятно, думаете, что содержимое выделенной памяти копируется / помещается в стек.Это неправда.В стек копируется копия указателя в память .Выделенная память никак не затрагивается.
Поскольку в CODE2 новая память выделяется при каждой итерации цикла, указатели в стеке указывают на отдельные области памяти (различные экземпляры)вашей label
struct).
В CODE1 вы не создаете память каждый раз, а просто выделяете один раз и повторно используете одну и ту же ячейку памяти в каждой итерации.
Вы помещаете указатель (в var1
) в это место в стек, но, поскольку он всегда один и тот же указатель, все указатели в стеке указывают на один и тот же адрес памяти (один и тот же экземпляр вашей структуры label
)).
Всякий раз, когда вы делаете
var1 -> root = var -> root -> right;
var1 -> disp = var -> disp + 1;
Поскольку var1
всегда указывает на одну и ту же память, вы просто перезаписываете одно и то же местоположение снова и снова.
Чтобы предложить простой аналог:
Это похоже на то, что когда вы делаете var1 = new label()
, вы берете новую коробку, пометьте ее номером.Вы удаляете все, что там есть, а затем помещаете в него новые вещи.Когда вы нажимаете на стек, это похоже на то, как вы записываете это число в список чисел.
В CODE2 вы берете пустое поле new в каждой итерации, помечаете еговведите новый номер, а затем запишите новый номер в свой список на листе бумаги.
В КОДЕ 1, у вас есть только ONE коробка.В каждой итерации вы снова берете этот блок, удаляете то, что вставляете туда, добавляете что-то новое и добавляете номер блока - один и тот же номер каждый раз - в список на вашем листе бумаги.
Конечно, это поле всегда содержит только то, что вы добавили в него в последней итерации.Все остальные вещи, которые вы вставили в него итерациями ранее, потеряны, потому что вы заменили его.
Еще одна, хотя и в этом случае, небольшая проблема заключается в том, что вы никогда не освобождаете выделенную память.В этом случае это не имеет большого значения, так как после завершения процесса память все равно будет освобождена, но это плохой навык, который в более сложных программах приведет к утечкам памяти и окончательному завершению процесса.