Ошибка delete_scalar при перегрузке оператора присваивания c++
Код до конца работает, но после окончания работы возникает данная ошибка:

#include <iostream>
using namespace std;
class Myclass {
private:
int* data;
public:
Myclass(int *data) {
this->data = new int;
this->data = data;
cout << "Constructor" << this<<endl;
}
Myclass & operator =(const Myclass &other) {
cout << "ravenstvo" << this<<endl;
if (this->data != nullptr){
delete this->data;
}
this->data = new int;
this->data = other.data;
return *this;
}
~Myclass() {
cout << "Destructor" << this<<endl;
delete this->data;
}
};
int main() {
int* a = new int;
*a = 5;
Myclass aa(a);
int* re=new int;
*re = 9;
Myclass qq(re);
qq = aa;
}
Ответы (1 шт):
Автор решения: Mikhailo
→ Ссылка
В конструкторе вы просто устраиваете утечку памяи и сохраняете внешний указатель:
Myclass(int *data) {
this->data = new int;
this->data = data;
Значит, aa содердит указатель a, а qq - указатель re.
При присвоении qq = aa
Myclass & operator =(const Myclass &other) {
cout << "ravenstvo" << this<<endl;
if (this->data != nullptr){
delete this->data; // Удаляете указатель `re`
}
this->data = new int;
this->data = other.data; // присваиваете qq указатель a - он теперь
// и у qq, и у aa
return *this;
}
А затем вызываете два деструктора. Каждый из которых удалит один и тот же указатель a - дважды один и тот же, что правилами запрещено и является UB.
Вот и вся ваша проблема. Вам надо написать и конструктор (и еще конструктор копирования), и оператор присваивания так, чтоб копировалось содержимое памяти, а не указатели.