Контест Middle RAII и умные указатели обновлено

Модель shared_ptr: кто и когда уничтожится

Условие

Смоделируйте владение через std::shared_ptr. Есть переменные (каждая хранит shared_ptr на объект или пустая) и объекты. У каждого объекта есть одно поле link, это тоже shared_ptr на объект или пустое. Команды:

  • new v o: переменной v присваивается новый объект с именем o (имена объектов не повторяются);
  • copy a b: b = a (если a пустая, b становится пустой);
  • reset v: v становится пустой;
  • link a b: в поле link объекта, на который указывает a, записывается указатель из b (переменная a гарантированно непуста).

Присваивание ведёт себя как у shared_ptr: новое значение захватывается раньше, чем отпускается старое. Когда объект уничтожается, сначала печатается destroy o, затем освобождается его поле link (что может уничтожить следующий объект). Переменные, которые ещё не встречались, пусты.

После всех команд выведите end, затем сбросьте все упомянутые переменные в порядке возрастания их имён (по кодам символов), печатая уничтожения. Последней строкой выведите leaked k и через пробел имена объектов, которые так и не уничтожились (из-за циклов), по возрастанию.

Ввод: q (1 ≤ q ≤ 3000), затем q команд. Имена из латинских букв и цифр, до 10 символов.

Вывод: строки destroy ..., end, leaked ... в описанном порядке.

Пример 1

Ввод:

6
new a x
new b y
link a b
reset b
copy a c
new a z

Вывод:

end
destroy z
destroy x
destroy y
leaked 0

Пример 2

Ввод:

5
new p n1
new q n2
link p q
link q p
reset q

Вывод:

end
leaked 2 n1 n2

Как подойти

Подсказки: 2
  1. Деструктор: сначала тело, потом члены.
  2. Присваивание shared_ptr: сначала захват нового, потом отпускание старого.

Решите в тренажёре

Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.