Модель 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
- Деструктор: сначала тело, потом члены.
- Присваивание shared_ptr: сначала захват нового, потом отпускание старого.
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.
Ещё по теме «RAII и умные указатели»
- Управляющий блок shared_ptr
- Пользовательский удалитель
- Цикл из shared_ptr
- delete для new[]
- Объясни RAII на примерах
- Чем make_shared лучше shared_ptr(new T)
- Что происходит, когда умирает последний shared_ptr
- Что выведет: порядок конструкторов и деструкторов