2009-12-10 86 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

你是什麼意思破壞?把它歸零?或者你的意思是釋放?如果你的意思是後者,那麼你不必這樣做,因爲這個數組將被分配到堆棧上並在調用Heap-dtor時釋放。 – Christian 2009-12-10 08:23:44

+0

它可以在堆棧上分配,也可以不分配。這完全取決於如何創建堆實例。 – 2009-12-10 10:37:07

+0

你說得對,我應該更精確,並說「當堆實例超出範圍/取消分配時,數組將自動釋放」 – Christian 2009-12-10 13:07:58

回答

8

array不會動態分配,因此當對象不再存在於作用域中時,它的存儲將消失。事實上,你不能重新分配到array;這樣做是錯誤的。

0

您不必銷燬您的數組,因爲它被value使用並且只使用values(int)。

+0

傳遞參數時使用的術語不是「按值」嗎?也許你的意思是對的,但我覺得你的答案不清楚。 – foraidt 2009-12-10 09:16:03

+0

我的意思是「按價值」,當訪問它不是「通過引用」,即直接訪問該字段的值。 – 2009-12-10 10:13:21

2

在dtor中沒有什麼需要做的,因此你不需要寫一個。數組對象的內存不是動態分配的。因此,當Heap對象超出範圍時,將自動釋放分配給array的內存。

+0

答案有問題嗎?很想聽到downvote的原因。 – Naveen 2009-12-10 08:29:24

+4

這在技術上是不正確的。數組對象是在分配給Heap類實例的內存塊中創建的。因此,只有當堆實例被分配到堆棧上時,纔會在堆棧上創建數組對象。如果實例在堆上分配,則該數組對象將位於該塊中。 – 2009-12-10 08:30:25

+0

可能我使用術語堆棧鬆散一點。我的意思是數組對象的內存不是動態分配的,因此不需要顯式的內存管理。當封裝對象被釋放時它會自動清理。 – Naveen 2009-12-10 08:36:21

0

如果您將typedef更改爲基於指針的類型,則應刪除數組的每個ItemType。

所以,你可以通過數組迭代並刪除它們

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

如果您更改實現以使用「new」動態分配數組,則需要稍後執行此操作: delete [] array; – SapphireSun 2009-12-10 08:28:50

1

由於你的數組是靜態分配(即不使用new),析構函數實際上並不需要做任何事情 - 只要創建的堆超出範圍(如果動態創建,則會明確刪除),數組將消失。

只有在動態分配內存時(例如,在C代碼中使用newmalloc()),是否需要明確刪除(或free())它。

+2

「你的數組在靜態堆棧中分配」 - 這在技術上是不正確的。數組對象是在分配給Heap類實例的內存塊中創建的。因此,只有當堆實例被分配到堆棧上時,纔會在堆棧上創建數組對象。如果實例在堆上分配,則該數組對象將位於該塊中。 – 2009-12-10 08:32:45

+1

啊,好點。它並沒有真正改變答案的內容 - 當對象被銷燬時,數組將被銷燬(如果對象是靜態分配的,則超出範圍,或者如果分配了對象,則顯式刪除/釋放動態),所以不需要析構函數。 – 2009-12-10 08:41:08

+0

靜態數組將具有程序的生命週期。請記住,靜態分配不同於自動分配和動態分配。 – 2009-12-10 19:52:33

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 2009-12-10 12:11:43

+0

中分配數組哦,並且數組不是靜態的。這是一個非靜態類成員。 – jalf 2009-12-10 12:12:15

+0

澄清,在C++中只有一種數組。有多種存儲。數組的功能不取決於它所在的位置;只有它的一生。在執行離開函數之前,在函數中聲明的數組一直處於活動狀態。一個動態數組一直處於活動狀態,直到它被釋放或程序終止。 – 2009-12-10 19:50:33

1

陣列就像在你原來的例子是你Heap類的子對象:

但是,如果你想你的陣列切換到動態數組,可以按如下方式改變你的代碼。它由Heap構造函數自動構造,並由Heap析構函數自動構造。你不需要做任何事情來構建和/或破壞它。