递归清理

时间:2018-06-18 09:43:50

标签: c++ parsing pointers recursion memory

所以我开发递归下降解析器并没有完成它,因为我有一个指针问题。说实话 - 这不是问题,我只是想问我是否做得对。所以你可以看到这段代码:

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)。我可以使用这种方式添加更多的表达式,它们将被递归删除没有内存泄漏! (我用百班测试了它)

所以,最后,我的问题 - 我可以将这种“嵌入式”方法用于实际项目,或者这种方式看起来像初级垃圾代码吗?

1 个答案:

答案 0 :(得分:0)

在析构函数中删除子节点的一个问题是,当树足够深时,它将耗尽向下的树空间。解决方案是将所有节点存储在其他地方的阵列中,而节点不拥有其他节点。这种方式破坏树不会导致递归。

请注意,deletestd::free处理null指针,无需额外检查。