我不明白解放是如何运作的。我知道当我尝试两次释放内存时会发生这种情况。但是,这真的让我很难过。
我试图只发布代码的相关部分。
FILE* file = fopen(path, "r");
if (file == NULL)
{
error(500);
return;
}
// load file's content
BYTE* content;
size_t length;
if (load(file, &content, &length) == false)
{
error(500);
return;
}
这是加载功能
bool load(FILE* file, BYTE** content, size_t* length)
{
printf("\nLOAD STARTED\n");
content = NULL;
BYTE *data = NULL;
int size = 0;
while(!feof(file))
{
char ch = fgetc(file);
size += 1;
data = realloc(data, sizeof(BYTE) * (size));
*(data + (size - 1)) = ch;
}
content = &data;
*length = size;
printf("\nLOAD ENDED\n");
return true;
}
不久之后我打电话给free()
printf("\nFREEING CONTENT\n");
// free file's content
free(content);
printf("\nCONTENT FREED\n");
printf语句FREEING CONTENT
在我获得
munmap_chunk(): invalid pointer
错误。
答案 0 :(得分:0)
这是问题所在:
content = &data;
它在函数返回后指定超出范围的局部变量的地址。由于内容是一个函数参数,因此不会将任何内容写入指向的位置。你的意思是写
*content = data;
代替?如果是这样,则不应设置content = NULL
,因为您要使用通话load(file, &content, &length)
传递的地址。
答案 1 :(得分:-1)
我设法解决了这个问题。
content
基本上只是char*
。所以,我试过这个并且它有效......
我将content = &data
更改为content = &(data[0])
有效。欣赏所有输入。 :d