Вступить в клуб →
сложнаявопросООП, исключения и дизайн классов

После неудачного присваивания объект матрицы указывает на освобождённую память

Matrix& Matrix::operator=(const Matrix& other) {
    if (this == &other) return *this;
    delete[] data_;
    data_ = new double[other.size_];      // может бросить bad_alloc
    size_ = other.size_;
    std::copy(other.data_, other.data_ + size_, data_);
    return *this;
}

При нехватке памяти new бросает, исключение ловят выше и продолжают работу. Потом процесс падает в деструкторе Matrix с double free. Как переписать оператор?

  • Сначала выделить и скопировать, потом менять this
  • Обернуть new в try и вернуть *this при ошибке
  • Убрать проверку на самоприсваивание
  • Пометить оператор присваивания noexcept

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела