Ошибка 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.

Вот и вся ваша проблема. Вам надо написать и конструктор (и еще конструктор копирования), и оператор присваивания так, чтоб копировалось содержимое памяти, а не указатели.

→ Ссылка