我应该在什么时候对glob_t调用globfree?

编程语言 2026-07-10

关于 glob 的手册页 给出了 glob 函数本身的几个返回值:

``` On successful completion, glob() returns zero. Other possible returns are:

  GLOB_NOSPACE
         for running out of memory,

  GLOB_ABORTED
         for a read error, and

  GLOB_NOMATCH
         for no found matches.

```

它还描述了 globfree 函数:

The globfree() function frees the dynamically allocated storage from an earlier call to glob().

我的问题是:如果我想避免泄露 glob_t 数据,应该在调用 glob 之后始终调用 globfree,还是只有当 glob 返回0 时才调用?

据我所知,手册页并未详细说明失败调用 glob 是否会分配内存(GLOB_NOMATCH 返回值这种情况对我来说最模糊)。手册页中的示例也没有调用 globfree

换句话说,这些中哪一个(若有的话)是正确的:

glob_t result;
if (!glob("*", 0, NULL, &result)) {
  /* do something with result */
}
globfree(&result);

或者:

glob_t result;
if (!glob("*", 0, NULL, &result)) {
  /* do something with result */
  globfree(&result);
}

解决方案

来自 glob的 POSIX规范

If glob() terminates due to an error, it shall return one of the non-zero constants defined in <glob.h>. The arguments pglob->gl_pathcpglob->gl_pathv is still set as defined above.

由于 pglob->gl_pathv 是一个很可能已经分配了内存的对象:

  • 我们需要调用 globfree() 以确保如果已经分配了内存,就会被释放;以及
  • 由于它已经被初始化,我们可以自信地在这样做时不会使用未初始化的值(未定义行为)。

因此,对该问题的答案是“在调用 glob() 之后始终调用 globfree()”。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章