所以我开发递归下降解析器并没有完成它,因为我有一个指针问题。说实话 - 这不是问题,我只是想问我是否做得对。所以你可以看到这段代码:
class Expression
{
public:
virtual int eval() = 0;
virtual ~Expression() {}
};
class BinExpression : public Expression
{
private:
Expression * expr;
public:
BinExpression() {}
BinExpression(Expression* in): expr(in) {}
int eval()
{
return 1;
}
~BinExpression()
{
if(expr) delete expr;
}
};
class FxExpression : public Expression
{
private:
Expression * expr;
public:
FxExpression() {}
FxExpression(Expression* in) : expr(in) {}
int eval()
{
return 2;
}
~FxExpression()
{
if (expr) delete expr;
}
};
int main()
{
Expression* expr;
expr = new BinExpression();
expr = new FxExpression(expr);
delete expr;
return 0;
}
<小时/> 当然,我删除所有指向类的指针,而没有内存泄漏! 这种方法的本质是我可以制作封闭的表达式,这使我能够解决最简单的数学运算,同时考虑到符号的优先级。 正如你所看到的,程序删除指针(FxExpression)在结尾和析构函数类中删除他内部的类(BinExpression)。我可以使用这种方式添加更多的表达式,它们将被递归删除没有内存泄漏! (我用百班测试了它)
所以,最后,我的问题 - 我可以将这种“嵌入式”方法用于实际项目,或者这种方式看起来像初级垃圾代码吗?
答案 0 :(得分:0)
在析构函数中删除子节点的一个问题是,当树足够深时,它将耗尽向下的树空间。解决方案是将所有节点存储在其他地方的阵列中,而节点不拥有其他节点。这种方式破坏树不会导致递归。
请注意,delete
和std::free
处理null
指针,无需额外检查。