我在网上看到你可以像这样在野牛中释放记忆:
statement:
INTEGER
{
//Do Something
free($1);
}
如下所示,flex返回整数标记:
[0-9]+ { yylval.integer_value = atoi(yytext); return INTEGER; }
(integer_value定义为int)
当我尝试free($1)
时,我得到:
传递'free'的参数1使得整数指针没有强制转换
这是有道理的,但我已经看过在线示例,你可以释放这样的记忆。我该如何解决这个问题?
答案 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)
如果$1
是malloc()
或calloc()
或strdup()
的结果,通常作为其他作品的目标价值$$
或副作用在yylval
中的词法分析器操作中,您必须将其释放一段时间:否则您必须不。