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

时间:2014-09-30 00:52:58

标签: c string memory malloc strdup

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

从手册页:

  

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

     

这些函数可能会返回指向静态分配内存的指针,这些内存可能会被后续调用覆盖。的可替换地,   他们可能会返回一个指向路径某些部分的指针,这样路径引用的字符串不应该被修改或释放,直到   不再需要函数返回的指针。

它还说:

  

返回值
         dirname()和basename()都返回指向以null结尾的字符串的指针。 (不要将这些指针传递给免费(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);

strdupstrndup)手册页说:

  

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

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

1 个答案:

答案 0 :(得分:4)

dnamebname可能分别使用dircbasec的部分内容,因此释放它们并不安全。

我会strdupdirname来自basenamedirc来看basec个结果。然后可以安全地免费dircdname,并且您知道必须释放副本。

(是的,它很乱,但我认为它比记住你无法释放{{1}}更清晰,因为{{1}}可能会或可能不会使用它......)