C - 将缓冲区写入文件然后释放缓冲区会导致段错误

时间:2013-10-06 21:00:18

标签: c malloc free fwrite flush

我正在将缓冲区写入二进制文件。代码如下:

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调用,然而,问题仍然存在。

摆脱它的唯一方法是不释放内存,让操作系统为我做。这应该是不好的做法,所以我宁愿问是否有更好的解决方案。

在有人要求之前,是的,我检查文件是否正确打开,是的,我测试内存是否正确分配,不,我不会以任何方式触摸返回的指针。

1 个答案:

答案 0 :(得分:1)

一旦fwrite返回,您可以随意使用缓冲区做任何事情。您可以删除fflush来电。

这听起来像程序中一个完全不相关的部分的缓冲区溢出错误正在写出free需要完成其工作的簿记信息。在valgrind之类的工具下运行程序,以查明这是否是问题,并找到程序中有缓冲区溢出的部分。