gpt4 book ai didi

c - malloc 和 fgetc 的内存泄漏

转载 作者:太空宇宙 更新时间:2023-11-04 00:59:28 25 4
gpt4 key购买 nike

我在使用 malloc 和 getchar 读取用户点赞时遇到了一些问题。我得到了结果,但是,我使用 valgrind 得到了内存泄漏。我对此一无所知,问过我的同学和导师,但似乎都没有找到原因。

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] = '\0';
return newStringLine;
}

Valgrind 给我几个错误,包括 1 的无效写入/读取和无效的重新分配。

最佳答案

您对 realloc() 的使用是错误的。

realloc(),如果成功,将释放传递的指针并返回一个带有已分配内存的新指针。你需要

  • 在临时指针中捕获 realloc() 的返回值,
  • 检查 NULL 以确保成功,然后

    • 如果返回指针不为NULL,即重新分配成功,则使用新指针。
    • 如果返回的指针为 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

关于c - malloc 和 fgetc 的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45947988/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com