0

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

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

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

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

4

1 回答 1

1

一旦fwrite返回,您就可以自由地对缓冲区做任何您想做的事情。您可以删除fflush呼叫。

free听起来程序中完全不相关的部分中的缓冲区溢出错误正在覆盖需要完成工作的簿记信息。在类似的工具下运行您的程序,valgrind以查明这是否是问题所在,并找出程序中存在缓冲区溢出的部分。

于 2013-10-06T21:07:55.843 回答