我在网上读到你可以像这样释放野牛的内存:
statement:
INTEGER
{
//Do Something
free($1);
}
其中整数标记由 flex 返回,如下所示:
[0-9]+ { yylval.integer_value = atoi(yytext); return INTEGER; }
(integer_value定义为整数)
当我尝试free($1)
时,我得到:
传递参数 'free' 的参数 1 使指针从整数不带强制转换
这是有道理的,但我在网上看到了你可以像这样释放内存的例子。我该如何解决这个问题?
最常见的情况是,如果在较早的操作或词法分析器中分配了内存,则需要在操作中释放内存。 例如,您可能有一个弹性规则:
[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>
当任何符号作为错误恢复的一部分被丢弃时,或者使用 YYABORT
或 YYACCEPT
指令丢弃该符号时,这将释放由具有%type
或<id>
%token
的任何符号分配/拥有的内存。
如果$1
是malloc()
或calloc()
或strdup()
的结果,通常作为另一个生产的目标值$$
,或yylval
中词法分析器操作的副作用,你必须释放它一段时间:否则你不能。