2014-10-18 79 views
0

我想弄清楚如何從此代碼中刪除所有內存泄漏。我知道這個問題可能源於使用new Node<T>(value)時的push(T value)函數,但我不知道如何解決這個問題。C++堆棧使用模板鏈接列表 - 內存泄漏

#ifndef MYSTACK_H 
#define MYSTACK_H 

#include <stdexcept> 

using namespace std; 



template <class T> class MyStack{ 

template <class G> class Node{ 
    public: 
    G value; 
    Node* next; 
    Node(T val, Node* n = NULL): value(val), next(n){}; 
}; 

public: 
    MyStack(){ 
    head = NULL; 
    tail = NULL; 
    my_size = 0; 
    }; 

    ~MyStack(){ 
    delete head; 
    } 

    void push(T value){ 
    if(head == NULL){ 
     head = new Node<T>(value); 
     tail = head; 
     my_size++; 
    } 
    else{ 
     Node<T> *temp = new Node<T>(value); 
     temp->next = head; 
     head = temp; 
     my_size++;  
    } 
    } 

// . . . (removed - brevity) 

private: 
    unsigned int my_size; 
    Node<T> *head; 
    Node<T> *tail; 

}; 

#endif 

任何幫助,將不勝感激!謝謝!

+2

您如何期待堆棧中除head以外的元素被刪除? – SleuthEye 2014-10-18 03:57:21

+1

只是FYI,'Node'不需要是模板本身;它已經可以訪問'T'類型,因爲它是'MyStack'下的嵌套類型。也就是說,'MyStack :: Node'和'MyStack :: Node'已經是不同的類型。使Node成爲一個模板是多餘的 - 除非你需要'G'與'T'不同的類型,這在這裏似乎不是這種情況。 – cdhowie 2014-10-18 03:58:56

+0

@SleuthEye很明顯與析構函數,但我不知道如何實現它。 – mrlatinos 2014-10-18 04:44:17

回答

1

您需要刪除堆棧中的所有元素。這裏有幾種方法可以做到這一點:

  1. 在你的析構函數中,遍歷堆棧中的所有元素並刪除它們。
  2. 在你的析構函數中,反覆調用pop,直到堆棧爲空。

選項2可能是簡單的代碼,假設你已經有了一個pop功能,但可能不太有效,因爲它會做額外的工作,以確保堆棧結構,當它被破壞維持。

+0

現在看起來很明顯。我有一個彈出功能,所以我可能會選擇2,因爲我現在更擔心功能。感謝您的幫助! – mrlatinos 2014-10-18 06:05:54