문제

나는 종종 웹 사이트 www.cplusplus.com을 C 코드를 작성할 때 참조로 사용합니다.

나는 페이지에 인용 된 예를 읽고 있었다. 프레드 그리고 질문이있었습니다.

예를 들어 게시물을 게시합니다.

/* fread example: read a complete file */
#include <stdio.h>
#include <stdlib.h>

int main () {
  FILE * pFile;
  long lSize;
  char * buffer;
  size_t result;

  pFile = fopen ( "myfile.bin" , "rb" );
  if (pFile==NULL) {fputs ("File error",stderr); exit (1);}

  // obtain file size:
  fseek (pFile , 0 , SEEK_END);
  lSize = ftell (pFile);
  rewind (pFile);

  // allocate memory to contain the whole file:
  buffer = (char*) malloc (sizeof(char)*lSize);
  if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);}

  // copy the file into the buffer:
  result = fread (buffer,1,lSize,pFile);
  if (result != lSize) {fputs ("Reading error",stderr); exit (3);}

  /* the whole file is now loaded in the memory buffer. */

  // terminate
  fclose (pFile);
  free (buffer);
  return 0;
}

결과적으로 결과! = lsize, 무료 (버퍼)가 결코 호출되지 않을 것 같습니다. 이 예에서 이것이 메모리 누출일까요?

나는 항상 그들의 사이트의 사례가 매우 높은 품질이라고 생각했습니다. 아마도 나는 올바르게 이해하지 못합니까?

도움이 되었습니까?

해결책

메모리 누출이 아닙니다 이 예에서, 프로그램 종료 (전화로 exit()) 모든 메모리와 관련된 모든 메모리를 해방시킵니다.

그러나이 코드 조각을 서브 루틴으로 사용하고 다음과 같은 것을 호출하면 메모리 누출이 발생합니다. return 1; 대신에 exit().

다른 팁

기술적으로, 예, 메모리 누출입니다. 그러나 프로세스에 의해 할당 된 모든 메모리는 해당 프로세스가 종료되면 자동으로 해제 되므로이 예에서는 무료 (및 fclose)에 대한 호출이 실제로 필요하지 않습니다.

더 복잡한 프로그램에서 이것은 아마도 실제 문제 일 것입니다. 누락이 없으면 메모리 누출이 생기고 누락 된 fclose는 자원 누출을 유발합니다.

운영 체제는 해당 프로세스가 닫힐 때 프로세스에 의해 여정없는 메모리를 정리합니다. 적어도, 현대의 운영 체제.

포인트 결과에서 프로그램이 종료되지 않으면! = lsize, 즉 다른 실행 경로로 계속 된 경우 예 - 메모리 누출이 보장됩니다.

가능한 두 가지 경로가 있습니다.

(1) 결과! = lsize-이 경우 종료 (0)가 호출됩니다. 이것은 프로세스를 죽이고 운영 체제는 메모리를 정리할 것입니다.

(2) 결과 == lsize-이 경우 버퍼가 명시 적으로 풀려나지만 반환은 바로 나중에 호출되므로 무료는 대부분 좋은 스타일입니다. 이로 인해 프로세스를 죽이고 운영 체제는 메모리를 다시 정리할 수 있기 때문입니다. .

따라서이 간단한 경우에는 메모리 누출이 없습니다. 그러나 아마도 당신이 쓰는 응용 프로그램에 할당 한 메모리를 자유롭게하는 것이 좋은 관행 일 것입니다. 이 습관에 들어가면 앞으로 많은 두통이 당신을 위해 당신을 위해 많은 두통을 방지 할 것입니다.

가능한 메모리 누출에 관해서는, 다른 사람은 이미 그 질문에 대답했습니다. 얼마 전, 나는 주어진 코드의 변형을 게시했습니다. ~해야 한다 가능한 모든 오류 조건을 올바르게 처리합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top