当我运行析构函数时,运行失败,我不知道为什么这是我的树头
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类中我只会破坏root,但我相信我会以这种方式泄漏内存。这实际上是正确的方式还是我的递归破坏有问题。
答案 0 :(得分:6)
ExpressionNode
析构函数可以充分清理它的记忆,因为它可以摧毁它的孩子,从而充分清理记忆等等。你现在正在做的是双节点;一次由helper()
和一次由析构者自己完成。您需要做的就是销毁根节点
virtual ~ExpressionTree(){
delete root;
}
将通过析构函数删除所有子节点。