Как удалить массив указателей на объекты универсального типа
Мой класс имеет общий массив указателей член 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[]
независимо от типа элемента массива.