malloc和fgetc内存泄漏
我在使用malloc和getchar从用户那里读取like时遇到了一些问题。我得到了结果,但是,我使用valgrind得到了内存泄漏。我对此一无所知,曾询问过我的同学和导师,但似乎没有人知道原因malloc和fgetc内存泄漏,c,pointers,dynamic-memory-allocation,realloc,C,Pointers,Dynamic Memory Allocation,Realloc,我在使用malloc和getchar从用户那里读取like时遇到了一些问题。我得到了结果,但是,我使用valgrind得到了内存泄漏。我对此一无所知,曾询问过我的同学和导师,但似乎没有人知道原因 char *ReadLineFile(FILE *infile){ int i=0; char c; char *newStringLine; newStringLine = (char *) malloc(sizeof(char)); while( (c = fgetc(
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()
,如果成功,将释放传递的指针,并返回带有分配内存的新指针。你需要
- 在临时指针中捕获
的返回值realloc()
- 检查NULL以确保成功,然后
- 如果返回的指针不为NULL,即重新分配成功,则使用新指针
- 如果返回的指针为NULL,则做出一些决定,然后可以继续使用旧指针(作为参数传递)
C11
realloc
函数解除分配由ptr
指向的旧对象,并返回
指向新对象的指针,该对象的大小由size
指定。[……]
以及
[…]如果无法创建新对象的内存
分配后,旧对象不会被解除分配,其值不变
否则,如果,realloc()
成功,您(很可能)正在尝试使用已经空闲的d内存,这当然会导致
哦,我刚才提到过吗?您使用的
realloc()
是错误的
realloc()
,如果成功,将释放传递的指针,并返回带有分配内存的新指针。你需要
- 在临时指针中捕获
的返回值realloc()
- 检查NULL以确保成功,然后
- 如果返回的指针不为NULL,即重新分配成功,则使用新指针
- 如果返回的指针为NULL,则做出一些决定,然后可以继续使用旧指针(作为参数传递)
C11
realloc
函数解除分配由ptr
指向的旧对象,并返回
指向新对象的指针,该对象的大小由size
指定。[……]
以及
[…]如果无法创建新对象的内存
分配后,旧对象不会被解除分配,其值不变
否则,如果,realloc()
成功,您(很可能)正在尝试使用已经空闲的d内存,这当然会导致
哦,我提到了吗?回答得很快!我试着不铸造它,但是,我一直得到同样的泄漏和错误。你应该使用
realloc
的返回值。你把它扔掉了。@ricknaght完全忽略了关于铸造马洛克的回归的参考。一个不知道如何编写代码的低级程序员给出了一个答案。这是一个快速的回答!我试着不铸造它,但是,我一直得到同样的泄漏和错误。你应该使用realloc
的返回值。你把它扔掉了。@ricknaght完全忽略了关于铸造马洛克的回归的参考。一个不知道如何编写代码的低水平程序员给出了一个答案:“如果realloc()成功,那么您正试图使用一个已经空闲的d内存”:如果系统只是增加块的大小而不移动内存(这种情况经常发生),则不必如此。“但这是轮盘赌,”让·弗朗索瓦·法布说,“嗯,这不是保证,对吧?最好小心点。:)当然但我也看到过类似这样的问题,OP可以将代码运行到内存移动的某个点。错误的印象,它的工作@让·弗朗索瓦·法布,这正是我想要避免的。不过,添加了一条注释。:)成功了!正如建议的那样,我使用了一个临时变量,然后简单地将它赋回到我的newStringLine指针。这确实给了我一个教训!谢谢“如果realloc()成功,那么您正试图使用一个已经空闲的d内存”:如果系统只是增加块的大小而不移动内存(这种情况经常发生),则不一定如此。“但这是轮盘赌,”让·弗朗索瓦·法布说,“嗯,这不是保证,对吧?最好小心点。:)当然但我也看到过类似这样的问题,OP可以将代码运行到内存移动的某个点。错误的印象,它的工作@让·弗朗索瓦·法布,这正是我想要避免的。不过,添加了一条注释。:)成功了!正如建议的那样,我使用了一个临时变量,然后简单地将它赋回到我的newStringLine指针。这确实给了我一个教训!谢谢