2013-10-06 2 views
-1

Я пишу буфер в двоичный файл. Кодекс, как в следующем:C - запись буфера в файл, затем Снятие буфера вызывает segfault

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

Последний свободный() вызов вызывает у меня ошибки сегментации. После нескольких головных болей я думал, что это, вероятно, потому, что вызов fwrite будет выполняться только после задержки, а затем он будет читать свободную память. Поэтому я добавил вызов fflush, но проблема STILL возникает.

Единственный способ избавиться от него - не освободить память и позволить ОС сделать это для меня. Это должно быть плохой практикой, хотя, поэтому я бы предпочел, нет ли лучшего решения.

Прежде, чем кто-нибудь спросит, да, я проверяю, что файл открыт правильно, и да, я проверяю, что память распределена правильно, и нет, я не касаюсь возвращенных указателей каким-либо образом.

ответ

1

Как только fwrite возвращает вас, вы можете делать все, что хотите, с помощью буфера. Вы можете удалить звонок fflush.

Это звучит как ошибка переполнения буфера в абсолютно несвязанной части программы, которая записывает информацию о бухгалтерском учете, которую free должен выполнить свою работу. Запустите программу под инструментом, например valgrind, чтобы узнать, если это проблема, и найти часть программы с переполнением буфера.

+1

Вы были правы, у меня было переполнение буфера ровно 1 байт, что не имело никакого отношения к вызову free(). Как противно. Спасибо, что указал мне в правильном направлении. – Bregalad

Смежные вопросы