메모리 누수란?
: 메모리를 할당하고, 해제하지 않은 경우
#include <stdio.h>
#include <stdlib.h>
char* readBuf(File* file, const int size) {
int foo = 0;
char* buf = (char*) malloc(size * sizeof(char));
if(buf == NULL) { printf("메모리 할당 오류\n") ; exit(1); }
if(fread(buf, sizeof(char), size, file) != size) return NULL; // fread가 실패했다면?
return buf;
}
int main(void) {
FILE * fp;
char * pc;
int size = 80;
fp = fopen("tmp.txt", "r");
pc = readBuf(fp, size);
printf("%s\n", pc);
free(pc);
return 0;
}
if(fread(buf, sizeof(char), size, file) != size) return NULL;
전체 코드에서 위의 코드에서 fread가 실행되지 않아서 NULL이 반환되면 buf는 malloc을 통해서 할당 받았지만, 할당 해제(free)는 받지 못하는 상황이 나와 메모리 누수가 생긴다.
따라서, 이런 경우리르 방지 하기 위해서 아래와 같이 fread가 실하면 메모리도 해제해야한다
#include <stdio.h>
#include <stdlib.h>
char* readBuf(FILE* file, const int size) {
char* buf = (char*) malloc(size * sizeof(char));
if (buf == NULL) {
printf("메모리 할당 오류\n");
exit(1);
}
if (fread(buf, sizeof(char), size, file) != size) {
free(buf); // fread 실패 시 메모리 해제
return NULL;
}
return buf;
}
int main(void) {
FILE* fp;
char* pc;
int size = 80;
fp = fopen("tmp.txt", "r");
if (fp == NULL) {
printf("파일 열기 오류\n");
return 1;
}
pc = readBuf(fp, size);
if (pc != NULL) { // NULL 체크
printf("%s\n", pc);
free(pc);
} else {
printf("파일 읽기 오류\n");
}
fclose(fp); // 파일 닫기
return 0;
}
'2학년 2학기 > c언어' 카테고리의 다른 글
13-9장 메모리 누수(3)_먼저 할당된 메모리 주소를 해제를 한 경우 (0) | 2024.11.26 |
---|---|
13-8장 메모리 누수(2)_이미 해제된 동적 메모리 영역을 다시 해제 하려고하는 경우 (0) | 2024.11.26 |
13-6장 동적 할당에서의 대표적인 오류들 (0) | 2024.11.25 |
13-5장 realloc(), memset(), calloc() (1) | 2024.11.25 |
13-4장 구조체 동적 생성 (0) | 2024.11.25 |