我正在使用 Bison & Flex 或多或少 1 个月,所以如果我没有看到明显的东西,我很抱歉(但我认为不是)。
我有一个关于使用 Flex Bison 释放内存的问题。这是我的代码的样子:
parser.l
{DATE} { yylval.str= strdup(yytext);
pair<string,string> newpair = make_pair("DATE",yytext);
myvector.push_back(newpair);
return TOKEN_DATE ;}
这是我的 .l 文件的示例之一。我将 yytext 的值复制到 yylval.str 中。然后我使用该内容(实际上是键/值)创建一个新对,然后返回野牛的令牌日期。我的解析器 .y 不超过 yyparse;当有东西被捕捉到时,它就会打印出来。
我试图对此运行 valgrind,但我有多个关于 strdup 的错误。我知道这个函数使用 malloc,但我不知道何时何地使用 FREE。
我可能猜它在 .y 文件中,但在哪里?
test:
TOKEN_DATE { cout << $1 << endl; // here ? and what to free ?}
我真的不明白这一切,我真的很感激一个简单而清晰的解释。
提前致谢,
编辑:
我尝试了几件事,例如:
test:
TOKEN_DATE TOKEN_TOTO TOKEN_BLABLA { cout << $1 << endl; free($1); free($2);}
| TOKEN_DATE test { cout << $1 << endl, free($1); }
好像编译执行不错,但是valgrind还是跟我说strdup函数中包含的malloc有问题。但是我不能在 flex 文件中写 free(yylval.str) ,否则,bison 将不知道该值(如果我理解正确,我试过它不起作用)。我真的不知道如何解决这个泄漏问题。