什么时候在BISON中调用%析构函数?我有以下野牛代码:
%union{
char * sval;
Variable * vval;
}
%token VARIABLE
%token Literal
%type <vval> Expression VARIABLE
%type <sval> Literal
%destructor { delete $$; } <vval>
%destructor { delete $$; } Literal
Run Code Online (Sandbox Code Playgroud)
其中Variable是一个类.我认为在处理一行之后,所有的Variable对象都将被释放,但我看不到调用析构函数.这将导致直接内存泄漏......
编辑:要清楚; 我为新令牌分配了一个新的Variable对象,并将此令牌推送到BISON堆栈.我希望删除变量,当它被bison弹出并从堆栈中丢弃时.我认为%析构函数可以达到这个目的,但我不确定了..
丢弃的符号如下:
- 在错误恢复的第一阶段弹出堆叠符号,
- 在错误恢复的第二阶段进入终端,
- 当解析器立即返回时,当前前瞻和整个堆栈(当前右侧符号除外),和
- 解析器成功时的开始符号.
因此,如果您没有遇到错误,%destructor如果您立即返回(call YYABORT或YYACCEPT),将在堆栈上调用,或者如果解析成功,它将在启动符号上调用它.
我发现,我应该在执行操作后释放它,例如
...
| String CONCAT String { $$ = concat($1,$3); free($1); free($3); }
...
Run Code Online (Sandbox Code Playgroud)
这对我来说很有效。