2012-05-03 3 views
1

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

Element * elements = new Element[number]; 

где элементом является class, который имеет/нужен свой собственный деструктор.

, когда я иду, чтобы удалить это я бы использовать просто использовать массив удаления, и есть программа беспокоиться о вызове деструктора:

delete [] elements; 

или я называю деструктор для каждого элемента явно с помощью ключевого слова удаления:

for(int ii = 0; ii< ArraySize; ii++) 
    delete elements[ii]; 
delete [] elements; 

Примечание: Я понимаю, что я мог бы использовать что-то вроде boost::ptr_vector, но я хотел похож на hashTable функциональность (так для цикла потребуется дополнительная информация, но это находится вне прямой сферы этого вопроса), поэтому я использую традиционный массив. Я все равно хотел бы знать, какое поведение необходимо для предотвращения утечек памяти.

+0

Вы не храните указатели в своем массиве, поэтому 'delete []' должен делать трюк. – chris

ответ

3

Первый. Вы должны

delete [] elements; 

Второй неверен и должен давать вам ошибки, если вы попытаетесь его скомпилировать.

+0

, хотя для объекта в массиве потребуется вызванный деструктор, и поэтому в основном просто удаление массива вызовет деструктор для каждого объекта. – gardian06

+0

Да, 'delete [] elements' освободит память для всего массива и вызовет деструктор для каждого объект. Вы 'delete', что вы' new', и 'delete []' what you 'new []'. Здесь вы только делали 'new []', поэтому вам нужно только 'delete []'. – Cornstalks

1

Да, delete [] elements; должно быть достаточно.

Вы хотите использовать вторую часть кода что-то вроде:

Element **elements; 

elements = new Element *[rows]; 
for (int i=0; i<rows; i++) 
    elements[i] = new Element; 

Такое сочетание редко делает много смысла, хотя. Для того, чтобы хоть какой-то смысл, каждая строка будет сама быть динамически распределяемой массив, а также:

elements = new Element *[rows]; 
for (int i=0; i<rows; i++) 
    elements[i] = new Element[row_len]; 

В этом случае ваше удаление будет выглядеть примерно так:

for (int i=0; i<rows; i++) 
    delete [] elements[i]; 
delete [] elements; 

Как вы это делаете прямо сейчас, однако, ничто из того, что вы сказали, действительно оправдывает динамическое распределение на дому. std::vector<Element> elements(number); будет работать отлично.

+0

Я хочу, чтобы функция хеш-таблицы, которая фактически превосходила даже 'std :: vector' в терминах операций' HashTable', приблизительно равна O (2) даже для больших таблиц, предполагая, что она составляет менее 75%, тогда как даже самый хорошо реализованный вектор/смежный список - O (n), и ожидается, что этот массив обработает большое количество объектов. – gardian06

+1

@ gardian06: Но то, что вы делаете прямо сейчас, создает смежный массив, как и 'std :: vector'. Чтобы реализовать хеш-таблицу, вы, вероятно, хотите использовать 'std :: vector ''. Конечно, для хеш-таблицы ваш первый выбор обычно должен быть 'std :: unordered_map '. –

Смежные вопросы