Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在lex/yacc程序中,在何处释放使用_strdup分配的内存(用于联合)?_C_Bison_Yacc_Flex Lexer_Lex - Fatal编程技术网

在lex/yacc程序中,在何处释放使用_strdup分配的内存(用于联合)?

在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>$ =

我在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>
在我的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>