在lex/yacc程序中,在何处释放使用_strdup分配的内存(用于联合)?
我在yacc/bison文件中定义了以下联合结构:在lex/yacc程序中,在何处释放使用_strdup分配的内存(用于联合)?,c,bison,yacc,flex-lexer,lex,C,Bison,Yacc,Flex Lexer,Lex,我在yacc/bison文件中定义了以下联合结构: %union { int num; double dbl; char ch; char *str; } %token<str> cmd foo bar ... line: cmd prm semicolon { func($2); } ; prm: foo { $<num>$ = FOO_ID; } | bar { $<num>$ =
%union
{
int num;
double dbl;
char ch;
char *str;
}
%token<str> cmd foo bar
...
line:
cmd prm semicolon { func($2); }
;
prm:
foo { $<num>$ = FOO_ID; }
|
bar { $<num>$ = BAR_ID; }
;
%destructor { free($$); } <str>
在我的lex/flex文件中,我有以下匹配项:
[a-zA-Z][a-zA-Z0-9"_"]* { yylval->str = _strdup(yytext); return id; }
我的问题是,我把释放“str”的代码放在哪里
假设这是可以的。请注意,如果我将“空闲”放在字符串复制之前,则会出现访问冲突:
[a-zA-Z][a-zA-Z0-9"_"]* {
free(yylval->str);
yylval->str = _strdup(yytext);
return id; }
你确定你需要释放它吗?您在bison文件中的语义操作中使用字符串做什么?如果只存储指针,那么就没有什么可以释放的了。如果你复制了另一个副本,那么立即释放它。好的,我对yacc/bison文件中的“str”(char*)做了两件事: 1.我使用strdup制作了另一个副本(之后我释放了副本) 2.例如,在lex/flex文件中,我没有显式地使用“char*”(字符串)执行任何操作:
";" { return semicolon; }
"foo"|"FOO" { return foo; }
"bar"|"BAR" { return bar; }
…在yacc/bison文件中:
%union
{
int num;
double dbl;
char ch;
char *str;
}
%token<str> cmd foo bar
...
line:
cmd prm semicolon { func($2); }
;
prm:
foo { $<num>$ = FOO_ID; }
|
bar { $<num>$ = BAR_ID; }
;
%destructor { free($$); } <str>