본문 바로가기
2학년 2학기/c언어

13-7장 메모리 누수(1)_fread가 실패해서 free를 실행하지 못하는 경우

by kkkkk1023 2024. 11. 26.

메모리 누수란?

: 메모리를 할당하고, 해제하지 않은 경우

 

 

#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;
}