munmap_chunk():无效指针中止(内核转储)如何正确释放()
我已经搜索了我面临的问题,但无法从给别人的答案中解决它。所以我在这里 代码如下:munmap_chunk():无效指针中止(内核转储)如何正确释放(),c,pointers,C,Pointers,我已经搜索了我面临的问题,但无法从给别人的答案中解决它。所以我在这里 代码如下: char *readFile(char *filename) { FILE *f = fopen(filename, "rt"); assert(f); fseek(f, 0, SEEK_END); long length = ftell(f); fseek(f, 0, SEEK_SET);
char *readFile(char *filename) {
FILE *f = fopen(filename, "rt");
assert(f);
fseek(f, 0, SEEK_END);
long length = ftell(f);
fseek(f, 0, SEEK_SET);
char *buffer = (char *) malloc(length + 1);
buffer[length] = '\0';
fread(buffer, 1, length, f);
fclose(f);
return buffer;
}
int main(){
char *content = readFile("filename");
free() // what to do here?
}
以下是错误:
munmap_chunk(): invalid pointer
Aborted (core dumped)
如果我问的问题太简单,我道歉。我是新来的。
免费(&length+1)代码>不确定您试图在那里做什么。你能解释一下吗<代码>长度
未动态分配,因此不应释放。也不知道+1
是做什么用的。免费(&length+1)
length
是一个long
(因此x86上的4
-字节或x86上的8
-字节)。因此,释放length+1
地址会尝试释放位于函数堆栈某处的地址(或在奇数情况下为1字节后)——这将导致各种未定义的行为。@kaylum我是第一次使用malloc()函数,正如我读到的,在使用malloc()之后,我们应该释放()它可以防止内存泄漏,释放过程应该与malloc()相反。这就是我使用free()的原因,但我不知道如何正确使用。@DavidC.Rankin它不是在堆中吗?malloc
和free
规则很简单-无论malloc
返回什么,都是需要传递到free
的确切指针。但是free
只能在不再需要分配的内存时调用。在您的情况下,最终要释放的指针是缓冲区
。但是,由于要将指针返回给调用方,因此不能释放它。在这种情况下,一旦不再需要缓冲区,调用方就有责任调用free
。