2011-11-01 32 views
0

這是結構:如何在C++中釋放一個具有指向這些結構的指針數組的結構?

struct Node { 
    Node *nodes[MAX] 
}; 

所以結構裏面,我們有一個指針數組更多的節點結構,等等。

基本上初始節點分配給(使用新節點),然後我們爲我們需要使用的任何節點分配空間。 即。

Node *full = new Node(); 
Node *another = new Node(); 
full->nodes[30] = another; 

所有其他指針都設置爲NULL。

由於我沒有在任何地方使用任何new [],我不需要使用delete [],對嗎?

回答

3

您可以在構造函數和析構函數添加到您的Node結構:

struct Node { 
    Node *nodes[MAX]; 
    Node() 
    { 
     for (int i = 0; i < MAX; i++) 
      nodes[i] = 0; 
    } 
    ~Node() 
    { 
     for (int i = 0; i < MAX; i++) 
      delete nodes[i]; 
    } 
private: 
    // disable copies/assignments 
    Node(const Node&); 
    Node& operator=(const Node&); 
}; 

所以,現在你只需要刪除根節點,所有的孩子都會在同一時間得到遞歸刪除。請注意構造函數在那裏以確保數組被清零。你不想最終在未初始化的內存上調用delete!另請注意,在NULL上調用delete是一個無效的操作(如果使用標準分配器)。

編輯:即使你在評論中說你不關心,但如上所述,在你的結構中禁用副本和賦值可能是一個好主意。這將防止你在腳上拍攝自己並刪除相同的內存兩次。

+1

請注意,您還需要考慮複製構造和分配語義。 –

+0

謝謝。還有卡爾,我最近也瞭解了這些,但他們不是我所做的事情所必需的。 – DillPixel

+0

@Karl,雖然我不認爲我的解決方案中引入了這個問題,但這是原始結構中的設計問題(或者,我們不知道OP如何跟蹤內存所有權)。我正在更新我的回答來掩蓋這一點,因爲我同意保護自己總是很好。 – Miguel

3

擁抱C++。除了最底層的代碼之外,你絕對不應該只處理裸數組。 (一旦你瞭解到了,請查看smart_ptr模板類,看看它如何進一步簡化。)

class Node { 
public: 
    std::vector<Node*> nodes; 
    Node() { nodes.resize(MAX); } 
    ~Node() { 
     for (std::vector<Node*>::iterator it = nodes.begin(), end = nodes.end(); it != end; ++it) { 
      delete *it; 
     } 
    } 
}; 
相關問題