野牛 - 符号表 - 免费匹配malloc

问题描述 投票:0回答:1

我正在通过Bison手册中的mfcalc示例,我对符号表有疑问。

特别是在常规putsym(),我们调用malloc,但我没有看到对free的相应调用。我们是否需要手动释放符号表(以下代码中的sym_table)或者该工具是否自动处理?

symrec *
putsym (char const *sym_name, int sym_type)
{
  symrec *ptr = (symrec *) malloc (sizeof (symrec));
  ptr->name = (char *) malloc (strlen (sym_name) + 1);
  strcpy (ptr->name,sym_name);
  ptr->type = sym_type;
  ptr->value.var = 0; /* Set value to 0 even if fctn.  */
  ptr->next = (struct symrec *)sym_table;
  sym_table = ptr;
  return ptr;
}
c malloc bison free
1个回答
2
投票

“该工具”对您的行为所做的事情一无所知。

我引用了“工具”,因为实际上,在大多数解析项目中至少涉及两个代码生成工具:解析器生成器(在这种情况下是野牛)和扫描器生成器(也许是(f)lex)。 mfcalc示例使用手工构造的词法分析器以避免依赖于lex,尽管使用(f)lex可能更简单。在任何情况下,对符号表库的唯一调用都在扫描程序中,并且与bison生成的代码完全无关。

当然,还有其他工具在起作用。例如,整个项目使用C编译器构建,并在某种托管环境中运行(使用C标准的单词);换句话说,一个操作系统和运行时支持库,其中包括mallocfree的实现(尽管如你所指出的那样,free无法通过示例代码调用)。

我最后提到这些是因为它们与你的问题有关。当进程终止时,将释放所有进程资源,包括其内存映像。 (这不是C标准所要求的,但几乎所有托管环境都以这种方式工作。)因此,如果要在程序终止时使用free()内存,则不需要分配exit(1)内存。

与全局变量一样,未发布的内存分配在同一时间非常常见。这些天,这些东西被认为是不好的做法(充其量),大多数程序员都会避开它们,但情况并非总是如此。曾经有一段时间,许多程序员认为只是为了在程序终止之前释放资源而浪费资源,或者跳过必要的环节以确保预先终止清理得到保证。 (即使在今天,许多程序员只会在发生不可恢复的错误时插入对mfcalc的调用,而不是去追踪并手动释放每个分配的内存块。特别是在非生产代码中。)

无论您是否赞同这种编码风格,野牛手册(以及其他许多代码示例)中的示例都可追溯到无辜的时间。

因此,这个例子中的符号表条目永远不会被释放。您的生产代码可能应该做得更好,但它也应该使用更高效的数据结构并避免依赖于(单个)全局上下文。但这些都与qazxswpoi试图说明的野牛特征无关。

© www.soinside.com 2019 - 2024. All rights reserved.