문제
나는 종종 웹 사이트 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-이 경우 버퍼가 명시 적으로 풀려나지만 반환은 바로 나중에 호출되므로 무료는 대부분 좋은 스타일입니다. 이로 인해 프로세스를 죽이고 운영 체제는 메모리를 다시 정리할 수 있기 때문입니다. .
따라서이 간단한 경우에는 메모리 누출이 없습니다. 그러나 아마도 당신이 쓰는 응용 프로그램에 할당 한 메모리를 자유롭게하는 것이 좋은 관행 일 것입니다. 이 습관에 들어가면 앞으로 많은 두통이 당신을 위해 당신을 위해 많은 두통을 방지 할 것입니다.
가능한 메모리 누출에 관해서는, 다른 사람은 이미 그 질문에 대답했습니다. 얼마 전, 나는 주어진 코드의 변형을 게시했습니다. ~해야 한다 가능한 모든 오류 조건을 올바르게 처리합니다.