Ошибки при переинициализации объекта класса(проблемы с утечкой памяти(вроде)). 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;
}
Вызывает ошибки:
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 шт):
Вам нужна Большая тройка (пятерка :)) — нужны еще конструктор копирования и оператор присваивания, и все заработает... Без этого у вас происходит поверхностное копирование указателя и вы два раза его потом пытаетесь удалить, что неверно.
Нужно также хранить размер (иначе как копировать?... на это вам указал и 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;
}
};