什么时候在BISON中调用%析构函数?

时间:2011-06-19 08:12:51

标签: c++ bison

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堆栈。我希望删除 Variable ,当它被bison弹出并从堆栈中丢弃时。我认为%析构函数可以达到这个目的,但我不确定了..

2 个答案:

答案 0 :(得分:6)

From the Bison Manual:

  

丢弃的符号如下:

     
      
  • 在错误恢复的第一阶段期间弹出堆叠符号
  •   
  • 错误恢复第二阶段的传入终端
  •   
  • 当前前瞻和整个堆栈(当前除外)   右手边的符号)当   解析器立即返回,
  •   
  • 解析器成功时的起始符号。
  •   

因此,如果您没有遇到错误,如果您立即返回(call YYABORT or YYACCEPT),将在堆栈上调用%destructor,或者如果解析成功,它将在启动符号上调用它。 / p>

答案 1 :(得分:3)

我想通了,我应该在执行动作后释放(),例如

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

这对我有用。