C++ BISON中何时调用%析构函数?
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
%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); }
...
这对我来说是个好办法。基本上,在所有你无法在一次行动中轻松清理的地方调用析构函数。。。