当在BISON中调用%析构函数时

When is %destructor invoked in BISON?

本文关键字:析构函数 调用 BISON 当在      更新时间:2023-10-16

%析构函数何时在BISON中调用?我有以下野牛代码:

%union{
    char * sval; 
    Variable * vval; 
} 
%token VARIABLE 
%token Literal 
%type <vval> Expression VARIABLE 
%type <sval> Literal 
%destructor { delete $$; } <vval> 
%destructor { delete $$; } Literal 

其中变量是一个类。我以为在处理完一行之后,所有Variable对象都会被释放,但我看不到任何析构函数被调用。这将直接导致内存泄漏。。。

编辑:要清楚;我为一个新令牌分配了一个新的Variable对象,这个令牌被推送到BISON堆栈。当变量被bison弹出并从堆栈中丢弃时,我想删除它。我以为%析构函数可以达到这个目的,但我现在不确定了。。

来自野牛手册:

丢弃的符号如下:

  • 在错误恢复的第一阶段期间弹出的堆叠符号
  • 在错误恢复的第二阶段期间的进入终端
  • 当前前瞻和整个堆栈(除了当前右侧符号)解析器立即返回,并且
  • 开始符号,当解析器成功时

因此,如果您没有遇到错误,如果您立即返回,则会在堆栈上调用%destructor(调用YYABORTYYACCEPT),或者如果解析成功,则在开始符号上调用它。

我发现,我应该在执行操作后释放()它,例如

...
| String CONCAT String { $$ = concat($1,$3); free($1); free($3); }
...

这对我很有用。