Как исправить код что-бы небыло потери памяти

Есть код

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. Да, на всякий случай - всю остальную функциональность не смотрел.

→ Ссылка