Выбор ответа Middle Правило 0/3/5 обновлено

Самоприсваивание

Вопрос

Присваивание написано так: delete[] data_; data_ = new int[o.size_]; std::copy(o.data_, o.data_ + o.size_, data_);. Что сломается при a = a?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Чтение освобождённой памяти: o.data это тот же data. При самоприсваивании o и this один объект: после delete[] data источник уже уничтожен, дальше чтение освобождённой памяти.

Варианты ответа

  1. Ничего: копирование объекта в самого себя безопасно для массивов
  2. Чтение освобождённой памяти: o.data_ это тот же data_правильный ответ
  3. Утечка памяти: старый буфер data_ останется неосвобождённым
  4. Бесконечная рекурсия: operator= вызовет сам себя через copy

Разбор

При самоприсваивании o и *this один объект: после delete[] data_ источник уже уничтожен, дальше чтение освобождённой памяти. Лечится проверкой if (this == &o) return *this; или идиомой copy-and-swap, которая заодно спасает при исключении из new.

  • Безопасно было бы, если бы копия создавалась до освобождения.
  • Утечки нет, есть use-after-free.
  • Рекурсии нет: оператор себя не вызывает.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.