下面的函数基本上模拟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;
}
答案 0 :(得分:3)
查看dirname:http://linux.die.net/man/3/dirname的手册页。 “dirname()和basename()都返回指向以null结尾的字符串的指针。(不要将这些指针传递给free(3)。)”另外,你可能不应该像你那样做dir = dirname(dir)丢失了指向strdup分配的内存的指针(strdup分配的内存应该传递给free)。
答案 1 :(得分:1)
man page for dirname
表示您不应将返回值传递给free()
。然而,这正是你在做的事情。
答案 2 :(得分:1)
根据手册页:
警告 dirname()函数返回一个指向内部静态存储空间的指针,该空间将被覆盖 后续调用(每个函数都有自己独立的存储空间)。
所以你可能不想释放它。我猜这在linux上有所不同吗?