2009-12-10 2 views
2
#include <cstdlib> 
#include <iostream> 

using namespace std; 

const unsigned long MAX_SIZE = 20; 
typedef int ItemType; 

class Heap { 
private: 
     ItemType array[MAX_SIZE]; 
     int elements; //how many elements are in the heap 
public: 
     Heap() 
     ~Heap() 
     bool IsEmpty() const 
     bool IsFull() const 
     Itemtype Retrieve() 
     void Insert(const Itemtype&) 
}; 

Предположим, у меня это как файл заголовка. В моей реализации для этого, что является лучшим способом создания конструктора Heap() и ~ Heap() деструктора.Как разрушить массив

У меня есть

Heap::Heap() 
{ 
    elements = 0; 
} 

Heap::~Heap() 
{ 
    array = NULL; 
} 

Я интересно, если это правильный способ уничтожить и построить массив в этом случае.

+3

Что вы подразумеваете под разрушением? Нуль это? Или вы имеете в виду освобождение? Если вы имеете в виду последний, то вам не нужно, поскольку этот массив будет выделен в стеке и освобожден при вызове кучи-dtor. – Christian

+0

Это МОЖЕТ быть выделено в стеке, иначе это может быть не так. Это будет полностью зависеть от того, как создаются экземпляры кучи. – 2009-12-10 10:37:07

+0

Вы правы, я должен был уточнить и сказал, что «массив будет освобожден автоматически, когда экземпляр кучи выходит из области видимости/получает освобожденный» – Christian

ответ

8

array не динамически выделяется, поэтому хранилище для него уходит, когда объект больше не существует в области видимости. Фактически, вы не можете переназначить до array; это ошибка.

0

Вам не нужно уничтожать массив, так как он используется по значению и использует только значения (int).

+0

Не используется ли термин «по значению» при передаче параметров вокруг? Может быть, вы имеете в виду правильную вещь, но я нахожу ваш ответ неясным. – foraidt

+0

Я имею в виду «по значению», когда доступ не «по ссылке», т. Е. Прямой доступ к значению поля. –

2

В dtor ничего не нужно делать, поэтому вам не нужно писать. Память для объекта массива не распределяется динамически. Следовательно, когда объект Heap выходит за пределы области памяти, память, выделенная для array, автоматически освобождается.

+0

что-то не так в ответе? Хотелось бы услышать причину падения. – Naveen

+4

Это технически некорректно. Объект массива создается в блоке памяти, выделенном для экземпляра класса Heap. Таким образом, объект массива будет создан в стеке только тогда, когда экземпляр кучи будет выделен в стеке. Если экземпляр выделен в куче, объект массива будет в этом блоке. –

+0

Может быть, я использую термин stack немного слабо. Я имел в виду, что память для объекта массива не распределяется динамически и, следовательно, не требуется явное управление памятью. Оно будет автоматически очищаться при освобождении инкапсулирующего объекта. – Naveen

0

Если вы изменили тип typedef на тип указателя, вы должны удалить каждый ItemType массива.

Таким образом, вы можете перебирать массив и удалить их

for (int i = 0; i < elements; i++) 
    delete array[i] // Supposing you created them with new 
+0

И если вы измените реализацию для динамического выделения массива с помощью «new», вам нужно будет это сделать потом: delete [] array; – SapphireSun

1

Поскольку ваш массив выделяется статически (то есть, без использования new), деструктор на самом деле не нужно ничего делать - как только созданная куча выходит за рамки (или явно удаляется, если она создана динамически), массив исчезнет.

Только при динамическом распределении памяти (например, с new или malloc() в случае кода C) вам нужно явно удалить (или free()) его.

+2

«ваш массив распределен статически в стеке» - это технически некорректно. Объект массива создается в блоке памяти, выделенном для экземпляра класса Heap. Таким образом, объект массива будет создан в стеке только тогда, когда экземпляр кучи будет выделен в стеке. Если экземпляр выделен в куче, объект массива будет в этом блоке. –

+1

Ах, хорошая точка. На самом деле это не изменяет мясо ответа: массив будет уничтожен, когда объект будет уничтожен (если вы выйдете из области видимости, если объект будет распределен статически или если он явно удален/свободен() ed, если он выделен динамически), поэтому нет необходимости в деструкторе. –

+0

Статический массив будет иметь время жизни программы. Просто помните, что статическое распределение отличается от автоматического и динамического распределения. –

2

В C++ существует два типа массивов: статические и динамические. Основное различие между ними заключается в том, как выделяется память для них. Статические массивы более или менее автоматически создаются и уничтожаются вашим компилятором. Программист должен создавать и уничтожать динамические массивы. В настоящее время ваш объект использует статический массив, поэтому вам не нужно беспокоиться о его создании или уничтожении.

Однако, если вы хотите, чтобы переключить массив в динамический массив, вы можете изменить свой код следующим образом:

typedef int ItemType; 
ItemType *array; // Pointer to location in memory where the array will reside. 

Heap::Heap() 
{ 
    array = new ItemType[MAX_SIZE]; // Assign memory for the array to use. 
    elements = 0; 
} 

Heap::~Heap() 
{ 
    delete[] array; // Clear the memory used by the array. 
} 
+0

создавать/строить/выделять массивы, а не «присваивать». Вы не можете назначать массивы в C++ – jalf

+0

oh, и массив не является статическим. Это нестатический член класса. – jalf

+0

Уточняющий, в C++ есть только один вид массива. Существует несколько хранилищ. Функциональность массива не зависит от того, где он находится; только его время жизни. Массив, объявленный в функции, остается активным до тех пор, пока выполнение не покинет функцию. Динамический массив жив до тех пор, пока он не будет освобожден или программа не завершится. –

1

массив как в исходном примере подобъектом вашего Heap класса. Он автоматически создается конструкторами Heap и автоматически уничтожается Heap деструктором. Вам не нужно ничего делать, чтобы конструировать и/или уничтожить его.

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