我应该在 C 中的 basename/dirname 之后释放 strdup 指针吗?

pak*_*man 9 c memory string malloc strdup

我想使用 POSIX 的basename功能(而不是 GNU 的)。

从手册页:

dirname() 和 basename() 都可以修改 path 的内容,因此在调用这些函数之一时可能需要传递一个副本。

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

它还说:

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

因此,该示例建议如下:

例子

       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);
Run Code Online (Sandbox Code Playgroud)

strdupstrndup)手册页说:

新字符串的内存通过 malloc(3) 获得,并且可以通过 free(3) 释放。

所以问题是:我应该释放 dirc 和 basec(按照strdup)还是不释放(按照basename)?

Joh*_*136 5

dnameandbname可能分别使用dircand 的一部分basec,所以释放dircor 是不安全的basec

我会strdupdirnamebasename调用中得出一个结果。然后可以安全地释放dircbasec,并且您知道必须释放您的副本。

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