Ошибки при переинициализации объекта класса(проблемы с утечкой памяти(вроде)). C++

Есть класс:

class ukz
{
public:
    int* uzks;
public:
    ukz(int n);
    ~ukz();
};

ukz::ukz(int n)
{ 
    uzks = new int[n];
}
ukz::~ukz()
{
    delete[] uzks;
}

Код main:

int main()
{

    ukz f = ukz(7);
    f = ukz(6);
    return 0;
}

Вызывает ошибки:

Ошибка 1 Ошибка 2 Ошибка 3 Ошибка 4

GPT предложил:

{
public:
    int* uzks;
    int size;
public:
    ukz(int n);
    ~ukz();
    ukz(const ukz& other);
    ukz& operator=(const ukz& other);
};
ukz::ukz(int n) : size(n) 
{ 
    uzks = new int[size];
}
ukz::~ukz()
{
    std::cout <<size<<"kk\n";
    delete[] uzks;
}
ukz::ukz(const ukz& other)
{
    size = other.size; 
    uzks = new int[size];
    for (int i = 0; i < size; ++i) {
        uzks[i] = other.uzks[i];
    }
}

ukz& ukz::operator=(const ukz& other) 
{
    if (this != &other) {
        delete[] uzks;
        uzks = new int[size];
    }
    return *this;
}

Ошибки выводить перестало, но и работать как надо не стало... Вывод в main значения size и uzks(через _msize) после каждой инициализации через конструктор показало, что они меняют размер только при первой инициализации и больше не чего.


Ответы (1 шт):

Автор решения: Harry

Вам нужна Большая тройка (пятерка :)) — нужны еще конструктор копирования и оператор присваивания, и все заработает... Без этого у вас происходит поверхностное копирование указателя и вы два раза его потом пытаетесь удалить, что неверно.

Нужно также хранить размер (иначе как копировать?... на это вам указал и GPT). Его код в части присваивания явно неверен, так как не меняет значение размера массива.

Но я бы вообще присваивал через обмен:

class ukz
{
public:
    ukz(size_t n):uzks(new int[n]),sz(n){}
    ~ukz() { delete[] uzks; }
    ukz(const ukz& u):uzks(new int[u.sz]),sz(u.sz)
    {
        for(size_t i = 0; i < sz; ++i) uzks[i] = u.uzks[i];
    }
    ukz& operator = (ukz u)
    {
        swap(u);
        return *this;
    }
private:
    int* uzks;
    size_t sz;
    void swap(ukz& u)
    {
        int * t = uzks; uzks = u.uzks; u.uzks = t;
        size_t s = sz; sz = u.sz; u.sz = s;
    }
};
→ Ссылка