2017-04-16 67 views
-1

我正在C程序中解碼數據。數據已壓縮,所以我試圖通過解壓縮正確的結果來解壓縮數據和成功。然後,我將這個解壓縮的數據傳遞給其他進程。該進程分配新數據,從傳入的數據中讀取數據,寫入新數據,然後釋放舊數據(因爲它不再使用)。但是,運行時,會在「free()」被調用的行中產生一個錯誤「decode.exe觸發了一個斷點」。 我的代碼是:免費數據時內存泄漏?

int decode (uint8_t* data, uint32_t size) { 
    compressed_stream stream; 
    stream.data = data; 
    stream.data_size = size; 

    uint32_t outsize; 
    //Compute output size and assign to outsize 
    //... 
    stream.out = (uint8_t*)malloc(outsize); 
    stream.size = outsize; 

    stream.inpos = stream.outpos = 0; 
    decompress(&stream); 
    //Not free stream.data yet 
    process(stream.out); 
    return 0; //Handling error later 
} 

「解壓縮()」函數被測試時,它不試圖改變指針分配輸出數據。我的數據沒有錯誤,而「如雷貫耳」來計算等於所需大小的輸出「的malloc()」返回非空數據

而且,過程如下:

int process(uint8_t* data) 
{ 
    //Process data here, assign it to global scope pointers for easy handling 
    //... 
    free(data); 
    return 0; 
} 

同樣,處理後的數據已經過測試並且沒有發生錯誤。但是當我到達「免費(數據)」行時,我崩潰了。

我試過不使用「process()」func,並在「decompress()」後釋放與stream.out相關的數據。但它仍然發生。 但是,當我試圖改變「免費(數據);」到:

realloc(data, 1); 
free(data); 

沒有錯誤發生。或者,當我改變「超大」的數值時,我的解壓縮數據輸出所需的數據大大多於沒有重分配數據的輸出,也沒有錯誤。

我不知道「malloc()」和「free()」函數發生了什麼。我的程序工作正常,它產生我需要的數據,但我想優化它使用的內存。感謝您的幫助或解釋!

+1

「我正在用C編寫一個程序」 - 然後發送垃圾郵件的原因是什麼? – Olaf

+0

Casting'malloc'很糟糕 - http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc –

+0

使用調試器並獲取stream.out的值。檢查compress()後的值。檢查函數內的值。他們都應該是相同的。 –

回答

0

現在我發現了什麼問題,我的「解壓縮()」func寫的一些字節超過了「malloc()」分配的內存大小來輸出。它不會像我預期的那樣產生錯誤。非常感謝@Nguai對您的評論。我試圖在處理之前存儲內存的位置,解壓縮時修改位置,並進行相減。然後,我發現它大於我之前分配的內存大小。