سؤال

أواجه مشاكل في فهم سبب اتباع تسرب الكود في حالة واحدة ، وليس في الحالة الأخرى. والفرق هو

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); في نهاية الكود ، فإن المخزن المؤقت يشير إليه NULL (لأن هذا ما اختبرته للخروج من الحلقة) وبالتالي عندما تتصل بحرية ، فأنت لا تسميها على المؤشر الأصلي لك malloc"د ، أنت تسميها لا شيء.

نصائح أخرى

لو fgets() عائدات NULL, buffer يفقد قيمتها الأصلية لذلك لم تعد تستطيع ذلك free هو - هي.

في القراءة الناجحة ، سيكون الأمر على ما يرام. ولكن عندما يتم الوصول إلى نهاية الملف ، ستعود FGETS NULL وبالتالي ستكون المخزن المؤقت فارغة ولن تتمكن من تحريره.

سوف تحصل على تسرب عندما تعود Fgets فارغة. من القانوني استدعاء مجانًا على مؤشر فارغ ولكن بالطبع من خلال هذه النقطة فقدت مؤشرك الأصلي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top