2016-06-08 134 views
1

當我運行析構函數,我得到一個運行失敗,我不知道爲什麼這裏是我的樹頭C++的析構函數

class ExpressionTree { 
private: 
    ExpressionNode* root; 
public: 
    ExpressionTree() : 
    hashmap(100000), 
    root(NULL) { 
    }; 
    virtual ~ExpressionTree(){ 
     helper(root); 
    } 

    void helper(ExpressionNode *node) { 
     if (!node) { 
      return; 
     } else { 
      helper(node->getLeft()); 
      helper(node->getRight()); 
      delete node; 
     } 
    } 
}; 

和我的節點頭

class ExpressionNode { 
private: 
    ExpressionNode* left; 
    ExpressionNode* right; 
    string data; 
public: 
    virtual ~ExpressionNode(){ 
     delete left; 
     delete right; 
    } 
}; 

現在一切如果在ExpressionTree類中工作的很好,我只會銷燬根,但我相信我是以這種方式泄漏內存的。這實際上是正確的方式還是有我的遞歸破壞有什麼問題。

+1

您正在刪除內存兩次。不要這樣做!並初始化指向'nullptr'的指針,否則您將嘗試刪除隨機內存。 – tkausl

回答

6

ExpressionNode析構函數充分清理它的內存,因爲它破壞了它的孩子們,充分清理他們的記憶等等。你現在正在做的是雙重釋放節點;一次由helper()和一次由析構函數本身。你所需要做的就是銷燬根節點

virtual ~ExpressionTree(){ 
    delete root; 
} 

所有的子節點都會通過析構函數被刪除。