我应该在什么时候对glob_t调用globfree?
关于 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 argumentspglob->gl_pathc和pglob->gl_pathvis still set as defined above.
由于 pglob->gl_pathv 是一个很可能已经分配了内存的对象:
- 我们需要调用
globfree()以确保如果已经分配了内存,就会被释放;以及 - 由于它已经被初始化,我们可以自信地在这样做时不会使用未初始化的值(未定义行为)。
因此,对该问题的答案是“在调用 glob() 之后始终调用 globfree()”。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。