Выбор ответа 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 источник уже уничтожен, дальше чтение освобождённой памяти.
Варианты ответа
- Ничего: копирование объекта в самого себя безопасно для массивов
- Чтение освобождённой памяти:
o.data_это тот жеdata_правильный ответ - Утечка памяти: старый буфер
data_останется неосвобождённым - Бесконечная рекурсия:
operator=вызовет сам себя черезcopy
Разбор
При самоприсваивании o и *this один объект: после delete[] data_ источник уже уничтожен, дальше чтение освобождённой памяти. Лечится проверкой if (this == &o) return *this; или идиомой copy-and-swap, которая заодно спасает при исключении из new.
- Безопасно было бы, если бы копия создавалась до освобождения.
- Утечки нет, есть use-after-free.
- Рекурсии нет: оператор себя не вызывает.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Правило 0/3/5»
- Длинная арифметика: класс BigUint и факториал
- Класс матрицы 2×2 и быстрое возведение в степень
- Что даёт copy-and-swap
- Как написать оператор присваивания
- Куда пропал конструктор по умолчанию
- Пустой деструктор и перемещение
- Когда не генерируется перемещение
- Что объявили и что сгенерирует компилятор