我应该在 C 语言中的 basename/dirname 函数后释放 strdup 指针吗?

11

我想使用POSIX的basename函数(而不是GNU的)。

从手册中可以得知:

dirname()和basename()都可能修改path的内容,因此在调用这些函数时最好传递副本。

这些函数可能返回指向静态分配内存的指针,该内存可能会被后续调用覆盖。 或者它们可能返回指向path的某个部分的指针,因此在函数返回的指针不再需要之前,不应修改或释放path所引用的字符串。

还有其他提示:

RETURN VALUE
dirname()和basename()都返回指向以空字符结尾的字符串的指针。 (不要将这些指针传递给free(3)。)

因此,示例代码建议做如下处理:

EXAMPLE

       char *dirc, *basec, *bname, *dname;
       char *path = "/etc/passwd";

       dirc = strdup(path);
       basec = strdup(path);
       dname = dirname(dirc);
       bname = basename(basec);
       printf("dirname=%s, basename=%s\n", dname, bname);

strdup(strndup)函数的手册说明:

使用malloc(3)获取新字符串的内存,并可以使用free(3)释放。

所以问题是:我是否应该像strdup一样释放dirc和basec的内存,还是像basename一样不释放?


3
你需要释放 dirc 和 basec(类似于 strdup),但不要释放 dname 和 bname(类似于 basename/dirname)。但是在你不再需要 dname 之前,你不能释放 dirc。 - rici
1个回答

7

dnamebname可能会使用dircbasec的某些部分,因此释放dircbasec并不安全。

我会对dirnamebasename调用结果进行strdup。然后就可以安全地释放dircbasec,而且你知道你必须释放你自己复制的内容。

(是的,这很混乱,但我认为它比记住不能释放dirc更干净,因为dname可能使用它,也可能不使用...)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接