2013-10-06 35 views
-1

我正在寫一個緩衝成一個二進制文件。代碼是在以下情況:Ç - 寫緩衝到一個文件中,然後釋放緩衝區事業段錯誤

FILE *outwav = fopen(outwav_path, "wb"); 
if(!outwav) 
{ 
    fprintf(stderr, "Can't open file %s for writing.\n", outwav_path); 
    exit(1); 
} 

[...]

//Create sample buffer 
short *samples = malloc((loopcount*(blockamount-looppos)+looppos) << 5); 
if(!samples) 
{ 
    fprintf(stderr, "Error : Can't allocate memory.\n"); 
    exit(1); 
} 

[...]

fwrite(samples, 2, 16*k, outwav); //write samplebuffer to file 

fflush(outwav); 
fclose(outwav); 
free(samples); 

最後的free()的調用導致我隨機段錯誤。 經過幾次頭痛後,我認爲這可能是因爲fwrite調用只會在延遲後執行,然後它會讀取釋放的內存。所以我添加了fflush調用,但問題仍然存在。

只有這樣,才能擺脫它是不釋放內存,讓OS爲我做的。這應該是不好的做法,所以我寧願問是否沒有更好的解決方案。

有人問之前,是的,我檢查文件被正確打開,是的,我測試的內存是正確分配,不,我不碰返回指針以任何方式。你可以自由地做任何你想要的緩衝

回答

1

一旦fwrite回報。您可以刪除fflush通話。

這聽起來像是程序的一個完全不相關的部分中的緩衝區溢出錯誤正在寫入free需要完成其工作的簿記信息。在valgrind這樣的工具下運行你的程序,看看是否有問題,並找到程序中有緩衝區溢出的部分。

+1

你是對的,我正好有1個字節的緩衝區溢出,這一點關係都沒有用free()調用。多麼討厭。感謝您指點我正確的方向。 – Bregalad