MiddleДебаггингЧастоЕщё не отвечали
Почему w = w; ломает этот operator=?
Это копирующее присваивание работает для разных объектов, но портит w = w;.
Widget& Widget::operator=(const Widget& other) {
delete data_;
data_ = new Data(*other.data_); // при самоприсваивании other.data_ уже удалён
return *this;
}
Найдите и исправьте ошибку.
При самоприсваивании (w = w;) оно удаляет data_, затем разыменовывает уже освобождённый other.data_ (тот же указатель) — use-after-free, UB. Решение: защита if (this != &other) или идиома copy-and-swap, которая безопасна и при самоприсваивании, и при исключениях.
- ✗Считать, что самоприсваивание не случается в реальном коде
- ✗Думать, что проблема в отсутствующем операторе return
- ✗Полагать, что это утечка, а не использование освобождённой памяти
- →Почему идиома copy-and-swap безопасна и при самоприсваивании, и при исключениях?
- →Как copy-and-swap переиспользует конструктор копирования и деструктор?