2016-06-08 89 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; 
} 

所有的子节点都会通过析构函数被删除。