Как исправить код что-бы небыло потери памяти
Есть код
template<typename T>
struct Array
{
private:
int MAX_LEN = 0;
int count = 0;
T* buff = NULL;
void fill(int value)
{
MAX_LEN = value;
buff = (T*)malloc(sizeof(T) * MAX_LEN);
}
public:
Array()
{
fill(0);
}
Array(int value)
{
fill(MAX_LEN);
}
int Count()
{
return count;
}
void Add(const T& value)
{
if (_Count == MAX_LEN)
{
MAX_LEN = (MAX_LEN & 0x00) + 0x100;
T* newValues = (T*)malloc(sizeof(T) * MAX_LEN);
memcpy(newValues, buff, sizeof(T) * count);
free(buff);
buff = newValues;
}
buff[count++] = value;
}
void Clear() {
count = 0;
}
T& operator [](int index)
{
if (index < 0 || index >= count)
{
throw;
}
return buff[index];
}
};
В строке T* newValues = (T*)malloc(sizeof(T) * MAX_LEN); идёт потеря памяти ведь она не освобождается. Вопрос как исправить код что-бы потери памяти не было
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
Добавить освобождение в деструкторе, и обязательно написать глубокие копирующий конструктор и оператор присваивания...
~Array() { free(buff); }
void swap(Array& a)
{
int tmp = MAX_LEN; MAX_LEN = a.MAX_LEN; a.MAX_LEN = tmp;
tmp = count; count = a.count; a.count = tmp;
T* b = buff; buff = a.buff; a.buff = b;
}
Array(const Array& a):MAX_LEN(a.MAX_LEN),count(a.count)
{
buff = (T*)malloc(sizeof(T) * MAX_LEN);
memcpy(buff,a.buff,sizeof(T) * MAX_LEN);
}
Array& operator=(const Array& a)
{
Array tmp(a);
swap(tmp);
return *this;
}
Но!!! Забудьте о malloc - вы в С++, а не в C, здесь надо использовать new и delete. Если только T чуть сложнее int - будете иметь большие неприятности!
И еще - не понимаю, зачем вам struct - чтобы тут же писать public и private? Почему не class?
P.S. Да, на всякий случай - всю остальную функциональность не смотрел.