C语言 如何释放野牛的记忆



我在网上读到你可以像这样释放野牛的内存:

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>
当任何符号作为

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

如果$1malloc()calloc()strdup()的结果,通常作为另一个生产的目标值$$,或yylval中词法分析器操作的副作用,你必须释放它一段时间:否则你不能。

最新更新