Эта строка: arr[i] = &Node(i);
хранит указатель на временный объект.Node(i)
создает временный объект, который может быть уничтожен в конце оператора, после чего все ссылки на него становятся недействительными, что означает, что результаты любого кода, который разыменовывает arr[i]
, будут неопределенными.Причина, по которой в этом случае вы получаете все 9, состоит в том, что компилятор оптимизирует код - поскольку за один раз создается только 1 временный Node(i)
, компилятор просто повторно использует эту память каждый раз в цикле.
Чтобы устранить проблему, выделите память из кучи для каждого объекта: arr[i] = new Node(i);
.Затем, когда вы закончите использовать их, вам также нужно будет помнить, чтобы удалить каждый из них:
for (int i=0; i < 10; ++i) {
delete arr[i];
}
Если вы хотите исследовать дальше, попробуйте добавить код в ваш класс Node
, чтобы увидеть, что происходит:Пример распечатайте адрес this
в вашем конструкторе и / или создайте деструктор, который просто распечатывает сообщение, чтобы вы могли видеть, как оно вызывается.