【问题标题】:Should I free strdup pointer after basename/dirname in C?我应该在 C 中的 basename/dirname 之后释放 strdup 指针吗?
【发布时间】:2014-11-24 12:09:57
【问题描述】:

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

来自手册页:

dirname() 和 basename() 都可以修改 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);

strdup(strndup) 手册页说:

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

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

【问题讨论】:

  • 你释放了 dirc 和 basec(根据 strdup),你没有释放 dname 和 bname(根据 basename/dirname)。但是在不再需要 dname 之前,您无法释放 dirc。

标签: c string memory malloc strdup


【解决方案1】:

dnamebname 可能分别使用了 dircbasec 的一部分,因此释放 dircbasec 是不安全的。

我会对dirnamebasename 调用的结果进行strdup。然后释放dircbasec 是安全的,你知道你必须释放你的副本。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-11
    • 2015-05-20
    • 1970-01-01
    • 2010-12-25
    • 2010-09-14
    • 2014-09-20
    • 2017-01-09
    • 1970-01-01
    相关资源
    最近更新 更多