【发布时间】:2017-01-07 11:29:16
【问题描述】:
所以我还有一个新手问题要问你。该函数用于从传入的文件中读取所有字节,将它们存储在堆中,然后将这些字节的地址存储在传入的 'content' 参数和传入的 'length' 参数中。
bool load(FILE* file, BYTE** content, size_t* length)
{
if (file == NULL)
{
return false;
}
//array to hold the bytes??
BYTE* buffer = malloc(sizeof(BYTE));
//To hold the number of bytes currently loaded
size_t size = 0;
//Pointer to keep track of where I am adding the data to in buffer
//get all the bytes from the file and put them in the buffer
for(int i = fgetc(file); i != EOF; i = fgetc(file))
{
buffer[size] = (char) i;
size++;
buffer = realloc(buffer, size + 1);
}
//dereference length
*length = size;
//derefernce content
*content = buffer;
//free(buffer);
return true;
}
所以以前这个函数所属的较大程序不起作用,但是当我注释掉
free(buffer);
在底部调用我的程序开始完美运行。当我遇到双重免费错误时,我有动力对此发表评论。所以我的问题是:为什么在这种情况下调用 free 会导致错误?
我的直觉告诉我,是因为数据
*content
points to 现在已“删除”,因此我的程序无法正常工作。此外,稍后在代码中的某个地方我也释放了内容*,这就是双重释放错误的来源。但是出于某种原因,我倾向于认为数据实际上并未“删除”。
对不起,如果这很多,我一直对内存分配,空闲和指针感到困惑,并试图获得更深入的了解。
【问题讨论】:
-
只是一个注释。您通过为从文件中读取的每个字符重复调用
realloc进行分配,这是您可以想象的最低效的realloc使用。相反,分配一些合理数量的字节(例如1024、4096或更多),然后保留索引并从文件中读取字符,直到索引(+1)达到您的原始限制,然后调用realloc并分配另一个4096等并重复。对一个 1 兆字节的文件,您将调用多少次realloc? -
David 说的……或者每次调用
realloc()时分配的空间量加倍——如果有太多多余的空间可用(例如,如果有更多超过 1 KiB 的未使用空间)。 -
@DavidC.Rankin
realloc函数的内部工作将只是进行相同的检查,然后如果超出当前容量,则调用其他函数,所以我认为它不必要地复杂化OP 的代码来提升这些检查。操作系统可能至少提供几千字节的块。 -
"出于某种原因,我倾向于相信数据实际上并没有被“删除”——这不太合乎逻辑
标签: c pointers malloc free realloc