2011-12-23 98 views
0

下面的函數基本上模擬了mkdir -p遞歸創建給定路徑的目錄。在Linux下,我沒有任何問題,但是在OSX下運行時,在調用free(dir)期間,它總是出現錯誤pointer being freed was not allocated。任何人都可以發現錯誤?當我在gdb中執行時,我沒有看到任何明顯的問題,dir已填充並且目錄結構創建時沒有錯誤。正在釋放的指針未分配(僅適用於osx)

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; 
} 

回答

3

看看dirname的手冊頁:http://linux.die.net/man/3/dirname。 「dirname()和basename()都返回指向空終止字符串的指針(不要將這些指針傳遞給空閒的(3)。)」另外,你可能不應該像你那樣做dir = dirname(dir)丟失了strdup分配的內存指針(strdup分配的內存應該被傳遞給空閒)。

1

man page for dirname表示您不應將返回值傳遞給free()。然而,這正是你正在做的。

1

根據手冊頁:

警告 的目錄名()函數返回一個指針,指向將由 後續調用(各功能有它自己的獨立的存儲)被覆蓋內部靜態存儲空間。

所以你可能不想被釋放它。我猜這是不同的Linux?

相關問題