c - 分配给缓冲区时 fgets 泄漏

标签 c memory-leaks fgets

我无法理解为什么以下代码在一种情况下会泄漏,而在另一种情况下不会。 区别在于

while(NULL!=fgets(buffer,length,file))//doesnt leak
while(NULL!=(buffer=fgets(buffer,length,file))//leaks

我以为会是一样的。

完整代码如下。

#include <stdio.h>
#include <stdlib.h>

#define LENS 10000

void no_leak(const char* argv){
  char *buffer = (char *) malloc(LENS);
  FILE *fp=fopen(argv,"r");

  while(NULL!=fgets(buffer,LENS,fp)){
    fprintf(stderr,"%s",buffer);

  }
  fclose(fp);
  fprintf(stderr,"%s\n",buffer);
  free(buffer);  


}
void with_leak(const char* argv){
  char *buffer = (char *) malloc(LENS);
  FILE *fp=fopen(argv,"r");

  while(NULL!=(buffer=fgets(buffer,LENS,fp))){
    fprintf(stderr,"%s",buffer);

  }
  fclose(fp);
  fprintf(stderr,"%s\n",buffer);
  free(buffer);  


}

最佳答案

因为您正在重新分配过去指向的缓冲区。当您到达代码末尾的 free(buffer); 时,buffer 将指向 NULL(因为这就是您测试的目的while 循环),因此当你调用 free 时,你不是在你 malloc 的原始指针上调用它,你什么都没有调用它。

关于c - 分配给缓冲区时 fgets 泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2825251/

相关文章:

c - 陷入无限 fgets 循环

c - gets() 不要求输入,除非在它之前使用 getchar() 或另一个 gets()

objective-c - 从 Swift 传递回调函数调用 Objective C 和 C

ios - Objective-C 中的自动引用计数不能防止或最小化什么样的泄漏?

c++ - 是否有比 boost::spirit::hold_any 更快的替代方法并且 hold_any 会导致内存泄漏

c# - MVVM 卡住事件 Hook

c - scanf() 和 fgets() 之间的区别

c - 如何组织我的 C 代码

c - 内存分配的差异

python - 链接 docker 容器以组合不同的库