我应该在C中的basename/dirname之后释放strdup指针吗?
我想使用POSIX的我应该在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)。) 因此,该示例建议如下: 示例
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。