当在BISON中调用%析构函数时
When is %destructor invoked in 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堆栈。当变量被bison弹出并从堆栈中丢弃时,我想删除它。我以为%析构函数可以达到这个目的,但我现在不确定了。。
来自野牛手册:
丢弃的符号如下:
- 在错误恢复的第一阶段期间弹出的堆叠符号
- 在错误恢复的第二阶段期间的进入终端
- 当前前瞻和整个堆栈(除了当前右侧符号)解析器立即返回,并且
- 开始符号,当解析器成功时
因此,如果您没有遇到错误,如果您立即返回,则会在堆栈上调用%destructor
(调用YYABORT
或YYACCEPT
),或者如果解析成功,则在开始符号上调用它。
我发现,我应该在执行操作后释放()它,例如
...
| String CONCAT String { $$ = concat($1,$3); free($1); free($3); }
...
这对我很有用。
相关文章:
- 析构函数调用
- 在具有向量的类构造函数中进行析构函数调用
- 从 c++ 中派生类的析构函数调用虚函数
- C++析构函数调用两次,堆栈分配的复合对象
- C++ 在析构函数调用之前删除的动态成员数组
- 析构函数调用c++中的一个向量
- Singleton模式中的手动析构函数调用:调用多次
- 从内部类的析构函数调用虚拟函数
- 与 boost odeint 集成期间的析构函数调用
- 堆栈展开如何与析构函数调用有关?
- C++:优化析构函数调用
- 以逗号分隔的表达式中的析构函数调用
- GCC 9.1 返回 void& 作为显式析构函数调用的结果类型。这是一个错误吗?
- 从C++中的虚拟析构函数调用虚拟方法
- 从指针返回对象时出现意外的析构函数调用
- 使用 decltype 显式析构函数调用
- C++析构函数调用了错误的对象
- 了解虚拟函数和析构函数调用
- 多重继承析构函数调用他自己和父析构函数?c++
- 析构函数调用表单不适当的库