C++ BISON中何时调用%析构函数?

C++ BISON中何时调用%析构函数?,c++,bison,C++,Bison,BISON中何时调用%析构函数?我有以下野牛代码: %union{ char * sval; Variable * vval; } %token VARIABLE %token Literal %type <vval> Expression VARIABLE %type <sval> Literal %destructor { delete $$; } <vval> %destructor { delete $$; } Li

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

%union{
    char * sval; 
    Variable * vval; 
} 

%token VARIABLE 
%token Literal 
%type <vval> Expression VARIABLE 
%type <sval> Literal 

%destructor { delete $$; } <vval> 
%destructor { delete $$; } Literal 
%union{
char*sval;
变量*vval;
} 
%标记变量
%标记文字
%类型表达式变量
%类型文字
%析构函数{delete$$;}
%析构函数{delete$$;}文本
其中变量是一个类。我认为在处理一行之后,所有变量对象都将被释放,但我看不到调用了析构函数。这将直接导致内存泄漏

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

丢弃的符号如下所示:

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

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

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

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

这对我来说是个好办法。

基本上,在所有你无法在一次行动中轻松清理的地方调用析构函数。。。