После неудачного присваивания объект матрицы указывает на освобождённую память
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
