【发布时间】:2014-04-27 10:01:12
【问题描述】:
我使用 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 将不知道该值(如果我理解正确,我试过它不起作用)。我真的不知道如何解决这个泄漏问题。
【问题讨论】:
标签: c++ memory-management bison flex-lexer strdup