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

我应该在C中的basename/dirname之后释放strdup指针吗?,c,string,memory,malloc,strdup,C,String,Memory,Malloc,Strdup,我想使用POSIX的basename函数(与GNU相反) 从手册页: dirname()和basename()都可以修改path的内容,因此 调用其中一个函数时,可能需要传递一个副本 这些函数可以返回指向静态分配内存的指针,这些指针可能会被后续调用覆盖或者, 它们可能会返回指向路径某个部分的指针,因此在 不再需要函数返回的指针 它还说: 返回值 dirname()和basename()都返回指向以null结尾的字符串的指针。(不要将这些指针传递给free(3)。) 因此,该示例建议如下: 示例

我想使用POSIX的
basename
函数(与GNU相反)

从手册页:

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

这些函数可以返回指向静态分配内存的指针,这些指针可能会被后续调用覆盖或者, 它们可能会返回指向路径某个部分的指针,因此在 不再需要函数返回的指针

它还说:

返回值
dirname()和basename()都返回指向以null结尾的字符串的指针。(不要将这些指针传递给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);
strdup
strndup
)手册页显示:

新字符串的内存由malloc(3)获得,可用free(3)释放


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

dname
bname
分别使用
dirc
basec
的部分,所以释放
dirc
basec
是不安全的

我将对
dirname
basename
调用的结果进行
strdup
。然后可以安全地释放
dirc
basec
,您知道必须释放副本

(是的,这很混乱,但我认为这比记住你还不能释放
dirc
更干净,因为
dname
可能正在使用它,也可能没有使用它……。

你释放了dirc和basec(根据strdup),而你没有释放dname和bname(根据basename/dirname)。但是你不能释放dirc,除非你不再需要dname。