В этом операторе
c.at(0) = thing();
используется неявно определенное оператором присваивания копии компилятора. Таким образом, член данных id
объекта, на который ссылается выражение c.at(0)
, становится равным идентификатору временного объекта, созданного выражением thing()
, который равен 2
.
В этом утверждении временный объект создается и в конце уничтожается
Thing 2 created.
Thing 2 destroyed.
Теперь объект c
содержит два подобъекта thing
, сохраненных как элементы массива. Подобъекты имеют идентификаторы 2
и 1
.
Они удаляются в порядке, обратном их созданию
Thing 1 destroyed.
Thing 2 destroyed. // previously it has id equal to 0
Таким образом, программа не имеет утечка памяти. Все созданные объекты были успешно удалены, как видно из вывода программы.