2016-07-28 81 views
1

我有這個C++結構:這是否是我的Node結構的正確析構函數?

struct Node { 
    char symbol; 
    unsigned int index; 
    vector<Node*> next; 

    // Constructors 
    Node():symbol('$'), index(0), next(0) {} 
    Node(char &c, const unsigned int &ind):symbol(c), index(ind), next(0) {} 

    // Add a new character 
    Node* add(char &c, const unsigned int &num) { 
     Node *newChar = new Node(c, num); 
     next.push_back(newChar); 
     return newChar; 
    } 

    // Destructor 
    ~Node() { 
     for (int i = 0; i < next.size(); i++) 
      delete next[i]; 
    } 
}; 

(我知道這可能會更好,使之類,但我們認爲這是因爲它是)。

我不太確定是否爲此編寫了正確的析構函數。在主函數中我使用了一個根節點:

Node *root = new Node(); 
+3

是一個鏈表的一部分?如果是這樣,如果你想刪除一個節點而不是解開整個鏈表? – PaulMcKenzie

+2

如果Node擁有所有下一個指針,並且所有這些指針都擁有它們的下一個指針,並且如果沒有別的使用任何指針指向的任何對象,那麼肯定它是正確的。 – evan

+2

既然你可以用你的「添加」創建非循環樹,並且析構器釋放了一個節點的整個分支,這個構造應該完美的工作。 – slav

回答

6

雖然代碼不會泄漏內存(只要你deletemain根節點),它是不是真的最佳。

您應該避免使用newdelete,而應該使用智能指針。在這種情況下,請使用unique_ptr

另外,不要在堆上創建根節點,只是創建它通常像這樣:

Node root; 
// use root normally 

您也不必遵循五原則正確,你甚至不需要擔心它,如果你使用unique_ptr,因爲你不會有自定義的dtor。也沒有理由通過和ind,refconst ref,只是傳遞它們的價值(因爲你甚至沒有改變它們,它的價值傳遞的價值,因爲基元的ref)。

有了這些變化,代碼如下

struct Node { 
    char symbol; 
    unsigned int index; 
    vector<std::unique_ptr<Node>> next; 

    // Constructors 
    Node():symbol('$'), index(0){} 
    Node(char c, unsigned int ind):symbol(c), index(ind) {} 

    // Add a new character 
    Node* add(char c, unsigned int num) { 
     next.push_back(std::make_unique<Node>(c, num)); 
     return next.back().get(); 
    } 
}; 
+0

感謝您重新編寫代碼,非常感謝。我試過多次學習智能指針,但從來沒有找到一個好的教程。我可能會用這個例子開始。 – alekscooper

+0

有一種情況是'add'返回'Node'而不是'Node *'。在沒有編譯器的投訴的情況下引用引用很難,並且如果你真的需要這個地址,它只是一個'&'而已。 – user4581301

+0

@ user4581301我同意,但我試圖保留返回類型,以便OP瞭解如何從使用原始指針轉換爲智能指針。 – user975989

相關問題