c – 在基于yacc的解析器中防止内存泄漏的最佳方法是什么?

c – 在基于yacc的解析器中防止内存泄漏的最佳方法是什么?,第1张

概述Yacc不允许传递物体.因为%union只能包含POD类型,所以复杂对象必须是新的并且由指针传递.如果发生语法错误,yacc解析器将停止运行,并且对所有这些创建的对象的引用都将丢失. 我提出的唯一解决方案是所有new’d对象继承特定的基类,在分配时添加到容器中,如果有错误,则可以删除该容器中的所有内容. 有谁知道任何更好的yacc技巧来解决这个问题? 请不要告诉我选择不同的解析器. 我喜欢Yacc Yacc不允许传递物体.因为%union只能包含POD类型,所以复杂对象必须是新的并且由指针传递.如果发生语法错误,yacc解析器将停止运行,并且对所有这些创建的对象的引用都将丢失.

我提出的唯一解决方案是所有new’d对象继承特定的基类,在分配时添加到容器中,如果有错误,则可以删除该容器中的所有内容.

有谁知道任何更好的yacc技巧来解决这个问题?

请不要告诉我选择不同的解析器.

解决方法 我喜欢Yacc,但是区别性的联盟堆栈确实是一个挑战.

我不知道你是使用C还是C.为了我自己的目的,我修改了Yacc来生成C,但是这个解决方案可以适用于C.

我首选的解决方案是将一个接口传递给解析树下的所有者,而不是堆栈中构造的对象.通过在Yacc之外创建自己的堆栈来做到这一点.在调用分配对象的非终端之前,将该对象的所有者推送到此堆栈.

例如:

class IExpressionOwner{public:    virtual ExpressionAdd *newExpressionAdd() = 0;    virtual ExpressionSubstract *newExpressionSubtract() = 0;    virtual ExpressionMultiply *newExpressionMultiply() = 0;    virtual ExpressiondivIDe *newExpressiondivIDe() = 0;};class ExpressionAdd : public Expression,public IExpressionOwner{private:    std::auto_ptr<Expression> left;    std::auto_ptr<Expression> right;public:    ExpressionAdd *newExpressionAdd()    {        ExpressionAdd *newExpression = new ExpressionAdd();        std::auto_ptr<Expression> autoptr(newExpression);        if (left.get() == NulL)            left = autoptr;        else            right = autoptr;        return newExpression;    }    ...};class Parser{private:    std::stack<IExpressionOwner *> ExpressionOwner;    ...};

想要表达式的所有东西都必须实现IExpressionOwner接口并在调用非终结表达式之前将其自身推送到堆栈.这是很多额外的代码,但它控制对象的生命周期.

更新

表达式示例很糟糕,因为在减少左 *** 作数之后才知道 *** 作.尽管如此,这种技术在许多情况下都有效,并且只需要对表达式进行一些调整.

总结

以上是内存溢出为你收集整理的c – 在基于yacc的解析器中防止内存泄漏的最佳方法是什么?全部内容,希望文章能够帮你解决c – 在基于yacc的解析器中防止内存泄漏的最佳方法是什么?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1229381.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存