2016-04-16 92 views
1

我不明白如何釋放工作。我知道這發生在我嘗試釋放內存兩次時。但是,這真的讓我感到困惑。munmap_chunk():無效指針錯誤

我試過只發布代碼的相關部分。

FILE* file = fopen(path, "r"); 
if (file == NULL) 
{ 
    error(500); 
    return; 
} 

// load file's content 
BYTE* content; 
size_t length; 
if (load(file, &content, &length) == false) 
{ 
    error(500); 
    return; 
} 

這是負載溫控功能

bool load(FILE* file, BYTE** content, size_t* length) 
{ 
    printf("\nLOAD STARTED\n"); 
    content = NULL; 
    BYTE *data = NULL; 
    int size = 0; 
    while(!feof(file)) 
    { 
     char ch = fgetc(file); 
     size += 1; 
     data = realloc(data, sizeof(BYTE) * (size)); 
     *(data + (size - 1)) = ch; 
    } 
    content = &data; 
    *length = size; 
    printf("\nLOAD ENDED\n"); 
    return true; 
} 

過了一會兒,我打電話免費()

printf("\nFREEING CONTENT\n"); 
// free file's content 
free(content); 
printf("\nCONTENT FREED\n"); 

printf語句FREEING CONTENT作品之後,我得到的

munmap_chunk(): invalid pointer錯誤。

+1

'content = &data;' - >>'* content = data;' – wildplasser

+0

'data [size] = ch;' - >'data [size ++] = ch;' – BLUEPIXY

+3

@BLUEPIXY得到了問題 - 你永遠不會改變大小,所以你的數據緩衝區永遠不會變大。此外,['while(!feof(file))'(幾乎總是)錯誤](http://stackoverflow.com/questions/5431941/why-is-while-feof-file-always-wrong) - *在你的代碼中是錯誤的。 –

回答

0

這就是問題所在:

content = &data; 

它分配一個本地變量,函數返回後超出範圍的地址。由於內容是一個函數參數,因此沒有任何東西會寫到它指向的地方。你的意思是寫

*content = data; 

取而代之?如果是這樣的話,你不應該設置content = NULL,因爲你要使用通過load(file, &content, &length)的呼叫傳遞的地址。

-1

我設法解決它。 content基本上只是一個char*。所以,我想這和它的工作...

我改變content = &datacontent = &(data[0])

它的工作原理。欣賞所有投入。 :D