如何在野牛中释放记忆?

时间:2017-10-13 12:19:55

标签: c bison flex-lexer

我在网上看到你可以像这样在野牛中释放记忆:

statement:
         INTEGER
         {
             //Do Something
             free($1);
         }

如下所示,flex返回整数标记:

[0-9]+        {  yylval.integer_value = atoi(yytext); return INTEGER; }

(integer_value定义为int)

当我尝试free($1)时,我得到:

传递'free'的参数1使得整数指针没有强制转换

这是有道理的,但我已经看过在线示例,你可以释放这样的记忆。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

如果在早期操作或词法分析器中分配了操作,则最常需要释放操作中的内存。例如,您可能有一个flex规则:

[a-zA-Z_][a-zA-Z_0-9]*    { yylval.id = strdup(yytext); return IDENT; }

此规则分配内存(strdup调用),因此您希望确保最终释放内存并且不会泄漏。所以你可能有

statement: IDENT {
            // do something
            free($1);
        }

请注意,如果您不将指针存储在稍后将要使用(和免费)的其他数据结构中,则只需要释放内存。在存在错误恢复的情况下释放内存也很棘手。 Bison为您提供了一个特殊的%destructor指令,可用于告诉解析器在从错误中恢复时如何清理解析堆栈:

%destructor { free($1); } <id>

当该符号作为错误恢复的一部分被丢弃时,或者使用{{1>时,这将释放由%type%token <id>的任何符号分配/拥有的内存。 }或YYABORT指令。

答案 1 :(得分:0)

如果$1malloc()calloc()strdup()的结果,通常作为其他作品的目标价值$$或副作用在yylval中的词法分析器操作中,您必须将其释放一段时间:否则您必须