malloc 和 fgetc 的内存泄漏
Memory leak with malloc and fgetc
我在使用 malloc 和 getchar 读取用户点赞时遇到了一些问题。我得到了结果,但是,我使用 valgrind 得到了内存泄漏。我对此一无所知,问过我的同学和导师,但none似乎找到了原因。
char *ReadLineFile(FILE *infile){
int i=0;
char c;
char *newStringLine;
newStringLine = (char *) malloc(sizeof(char));
while( (c = fgetc(infile)) != '\n' ){
newStringLine[i++] = c;
realloc(newStringLine, (sizeof(char) * (i+1)));
}
newStringLine[i] = '[=10=]';
return newStringLine;
}
Valgrind 给我几个错误,包括 Invalid write/read of 1 和 invalid realloc。
您对 realloc()
的用法有误。
realloc()
,如果成功,释放传递的指针和 returns 一个带有分配内存的新指针。你需要
- 在临时指针中捕获
realloc()
的 return 值,
检查 NULL 以确保成功,然后
- 如果returned指针不为NULL,即重新分配成功,则使用新指针。
- 如果 returned 指针为 NULL,做出一些决定,您可以继续使用旧指针(作为参数传递)。
相关,引用 C11
,章节 §7.22.3.5
The realloc
function deallocates the old object pointed to by ptr
and returns a
pointer to a new object that has the size specified by size
. [....]
并且
[...] If memory for the new object cannot be
allocated, the old object is not deallocated and its value is unchanged.
否则,如果 realloc()
成功,则您(很可能)正在尝试使用已经释放的内存,这当然会导致undefined behavior.
呃哦,我有没有提到,please see this discussion on why not to cast the return value of malloc()
and family in C?
我在使用 malloc 和 getchar 读取用户点赞时遇到了一些问题。我得到了结果,但是,我使用 valgrind 得到了内存泄漏。我对此一无所知,问过我的同学和导师,但none似乎找到了原因。
char *ReadLineFile(FILE *infile){
int i=0;
char c;
char *newStringLine;
newStringLine = (char *) malloc(sizeof(char));
while( (c = fgetc(infile)) != '\n' ){
newStringLine[i++] = c;
realloc(newStringLine, (sizeof(char) * (i+1)));
}
newStringLine[i] = '[=10=]';
return newStringLine;
}
Valgrind 给我几个错误,包括 Invalid write/read of 1 和 invalid realloc。
您对 realloc()
的用法有误。
realloc()
,如果成功,释放传递的指针和 returns 一个带有分配内存的新指针。你需要
- 在临时指针中捕获
realloc()
的 return 值, 检查 NULL 以确保成功,然后
- 如果returned指针不为NULL,即重新分配成功,则使用新指针。
- 如果 returned 指针为 NULL,做出一些决定,您可以继续使用旧指针(作为参数传递)。
相关,引用 C11
,章节 §7.22.3.5
The
realloc
function deallocates the old object pointed to byptr
and returns a pointer to a new object that has the size specified bysize
. [....]
并且
[...] If memory for the new object cannot be allocated, the old object is not deallocated and its value is unchanged.
否则,如果 realloc()
成功,则您(很可能)正在尝试使用已经释放的内存,这当然会导致undefined behavior.
呃哦,我有没有提到,please see this discussion on why not to cast the return value of malloc()
and family in C?