0

下面的函数基本上模拟mkdir -p,递归地为给定路径创建目录。在 Linux 上我没有任何问题,但是在 OSX 下运行它总是pointer being freed was not allocated在调用free(dir). 任何人都可以发现错误吗?当我在 gdb 中逐步执行时,我没有看到任何明显的问题,dir已填充并且目录结构创建时没有错误。

static int
mkpath(const char *path)
{
  int result = 0;
  struct stat st;
  char *p = NULL, *dir = strdup(path);
  char *tmp = g_malloc0(sizeof(char) * strlen(cache.path) + strlen(dir) + 1);

  dir = dirname(dir);
  tmp = strcpy(tmp, cache.path);
  p = strtok(dir, "/");
  while(p != NULL) {
    tmp = strncat(tmp, "/", 1);
    tmp = strncat(tmp, p, strlen(p));

    if(stat(tmp, &st) == 0) {
      if(S_ISDIR(st.st_mode)) {
        p = strtok(NULL, "/");
        continue;
      }

      result = -ENOTDIR;
      break;
    }

    if(mkdir(tmp, S_IRWXU) == -1) {
      result = -errno;
      break;
    }

    p = strtok(NULL, "/");
  }

  free(tmp);
  free(dir);

  return result;
}
4

3 回答 3

3

查看 dirname 的手册页:http: //linux.die.net/man/3/dirname。“dirname() 和 basename() 都返回指向以 null 结尾的字符串的指针。(不要将这些指针传递给 free(3)。)”此外,您可能不应该像那时那样执行 dir = dirname(dir)丢失了指向 strdup 分配的内存的指针(strdup 分配的内存应该传递给 free)。

于 2011-12-23T01:26:40.440 回答
1

手册页dirname说您不应该将返回值传递给free(). 然而,这正是你正在做的。

于 2011-12-23T01:26:54.090 回答
1

根据手册页:

警告 dirname() 函数返回一个指向内部静态存储空间的指针,该指针将被后续调用覆盖(每个函数都有自己独立的存储空间)。

所以你可能不想释放它。我猜这在linux上有所不同?

于 2011-12-23T01:28:08.100 回答