Как удалить массив указателей на объекты универсального типа

Мой класс имеет общий массив указателей член A:

T** A

В настоящее время я удаляю массив в деструкторе следующим образом:

~MyQuickInitArray(){
    delete [] A;
};

Это приведет к утечке памяти? если это так, я должен перебрать массив и вызвать delete на каждом объекте?

На заметку - нужно ли мне звонить delete [] B если B массив целых чисел или деструктор уже обрабатывает его?

РЕДАКТИРОВАТЬ:

Вот как происходит распределение:

MyQuickInitArray(int size)
{
    if(size <= 0)
    {
        throw new std::exception;
    }

    _size = size;
    _counter = 0;
    A = new T*[size];
    B = new int[size];
    C = new int[size];
}
    MyQuickInitArray(const MyQuickInitArray& myQuickInitArray)
    {
        _size = myQuickInitArray._size;
        _counter = myQuickInitArray._counter;
        A = new T*[_size];

        for(int i = 0; i<_size ;i++)
        {
            if(myQuickInitArray.A[i] != NULL)
            {
                A[i] = new T(*myQuickInitArray.A[i]);
            }
        }

        B = myQuickInitArray.B;
        C = myQuickInitArray.C;
    }

2 ответа

Решение

Это приведет к утечке памяти?

Вы можете рассчитывать на это, если A это массив указателей. Вам нужно перебрать массив и удалить указатели самостоятельно.

~MyQuickInitArray {
    for (int i =_size; i--;) {
        delete A[i];
    }
    delete [] A;
}

Мне нужно позвонить delete [] B если B массив целых чисел или деструктор обрабатывает его?

Да, всегда удаляйте то, что выделено new, Вы можете сделать это внутри деструктора вашего класса.

Это приведет к утечке памяти?

Да звоню delete[] В массиве указателей без удаления элементов, на которые указывают отдельные элементы, произойдет утечка памяти, поскольку "встроенные" указатели C++ не имеют семантики владения. Рассмотрите возможность использования "умных" указателей, например, unique_ptr<T> вместо "простых", чтобы избежать вызова деструкторов в цикле.

Нужно ли вызывать delete [] B, если B является массивом целых чисел

Вам нужно позвонить delete[] на все, что вы выделили new[]независимо от типа элемента массива.

Другие вопросы по тегам