gpt4 book ai didi

c++ - 在哪里释放 Bison/Flex 中的内存?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:23:30 26 4
gpt4 key购买 nike

我使用 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 中。然后我用该内容(实际上是键/值)创建一个新对,然后返回 bison 的 token 日期。我的解析器 .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是不会知道这个值的(如果我没理解错的话,我试过不行)。我真的不知道如何解决这个泄漏问题。

最佳答案

当您不再需要复制的字符串时,您需要释放它。在你相当简单的情况下,你可以 free($1) 在打印出来之后,但通常情况是解析器将复制的字符串插入到某个数据结构中,在这种情况下,该数据结构成为 malloc 存储的所有者,并且对 free 的调用将在析构函数中执行。

这与任何其他资源管理问题并没有什么不同;您需要始终清楚谁是已分配资源的所有者,因为所有者有责任在不再需要时释放资源。

内部发生的事情是 bison 维护了一堆语义值,每个语义值都有类型 YYSTYPE(即“语义类型”),这也是yylval 的类型。当 token 移入堆栈时,bisonyylval 复制到堆栈顶部。在执行与产生式对应的 Action 之前,bison 将产生式中每个终端和非终端的语义值安排为$1$2 等(这不是拷贝;各种 $x 符号被替换为对 bison 堆栈上某个位置的引用。)

非终结符也有语义值,因为每个 Action 都将一个值存储到伪变量$$ 中。 (如果 action 不这样做,$$ 的值是不可预测的,但它仍然存在。)在 action 完成后,bison 删除 $1$2... 取栈顶的值,然后将伪变量$$复制到栈顶。它不会对弹出的值做任何事情,所以如果它们需要被释放或以其他方式销毁, Action 必须自己做。

因为语义值是简单复制的,所以语义类型不应包含任何不可简单复制的 C++ 对象。

如果使用%union声明,那么语义类型YYSTYPE是一个union对象,需要告诉 bison union 标记适用于每个终端和非终端。在这种情况下,$$ 和所有 $n 都会自动附加正确的 .tag,并且操作变得更加类型化-安全。

关于c++ - 在哪里释放 Bison/Flex 中的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22534993/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com