2012-06-17 32 views
1

我不太熟悉C++,但我有設計和實現鏈表的任務。這是我在遞:「此泄密」鏈接列表泄漏?

template <typename T> 
struct Node 
{ 
    Node() : next(nullptr) {} 
    Node(T const & val) : next(nullptr), value(val) {} 

    Node * next; 
    T value; 
}; 

template <typename T> 
class LinkedList 
{ 
    public: 
     LinkedList() 
     { 
      begin_ = new Node<T>; 
      current_ = begin_; 
     } 
     ~LinkedList() 
     { 
      delete begin_; 
     } 

     void insert(T const & value) 
     { 
      Node<T> * node = new Node<T>(value); 
      node->next = current_->next; 
      current_->next = node; 
      current_ = current_->next; 
     } 

     void remove() 
     { 
      Node<T> * tmp = current_->next; 
      if(!end()) 
      { 
       current_->next = current_->next->next; 
      } 
      delete tmp; 
     } 

     bool end() const 
     { 
      return current_->next == nullptr; 
     } 

     void reset() 
     { 
      current_ = begin_; 
     } 

     void advance() 
     { 
      if(!end()) 
      { 
       current_ = current_->next; 
      } 
     } 

     T get() const 
     { 
      return current_->next->value; 
     } 

    private: 
     Node<T> * begin_; 
     Node<T> * current_; 
}; 

我通過了分配,但我的老師在析構函數~LinkedList()強調delete begin_和寫在它的旁邊。我一直在想如何delete begin_可能泄漏,但我仍然不明白。有人可以幫助我嗎?

+0

哦,你的老師可能錯過了說你沒有按照[三法則(http://stackoverflow.com/questions/4172722/什麼 - 是最規則的三)。 –

+0

@Als你是什麼意思? –

回答

2

您必須遍歷列表中的每個節點並刪除。保持一個單獨的指針到下一個,刪除當前,然後向前移動並繼續刪除,直到下一個指針爲空。

~LinkedList() 
{ 
    Node * current = begin_; 
    Node * aNext = begin_->next; 

    while (null != aNext){ 
     delete(current); 
     current = aNext; 
     aNext = current->next; 
    } 
} 

就像這樣。不知道你從哪裏開始,但........

+0

哦,我已經完全停留在他強調的界限上,我甚至沒有想到他可能會談論其他節點。非常感謝。 –

+0

什麼都沒問題:-)很樂意幫忙。此外,可能會認爲要「接受」你的最佳答案,當你有更多問題時,這會在以後幫助你。 – trumpetlicks

+0

是的,當然;但它不會讓我接受一段時間的答案! –

0

在Node的析構函數中,它應該發送delete命令到next,這樣它就可以釋放列表中的所有節點。

0

我想你會更好的理解是這樣:

~LinkedList() 
{ 
    reset(); 
    while(!end()) remove(); 
}