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

13-9장 메모리 누수(3)_먼저 할당된 메모리 주소를 해제를 한 경우

by kkkkk1023 2024. 11. 26.
#include <stdio.h>
#include <stdlib.h>

typedef struct _mys {
	char *A;
	int B;
} mys;

char* getBuf(void) {
	return (char *)malloc(100 * sizeof(char));
}

int main(void) {
	char * A;
	char * B;
	
	mys * m = (mys *)malloc(sizeof(mys));
	m->A = (char *)malloc(100*sizeof(char));

	getBuf();	// getBuf에서 할당한 메모리는 찾을 수 없으므로 해제 불가능하다.

	free(m);	// m을 먼저 해제했으므로 m->A에 접근할 수 없으므로 해제 불가능하다.
			
	return 0;
}

 

 

 

위 사진처럼 먼저 할당 된 메모리를 해제를 하면, 다음 할당된 메모리를 해제할 수 없기 때문에 2000번지의 메모리는 누수가 일어난다. 또한 getBuf로 할당된 메모리 주소값이 변수에 저장되지 않았기 때문에, 해제를 할 수 없어서 두 번째 메모리 누수가 일어난다.

 

 

따라서, 아래와 같이 변경하면 해결할 수 있다.

 

#include <stdio.h>
#include <stdlib.h>

typedef struct _mys {
    char *A;
    int B;
} mys;

char* getBuf(void) {
    return (char *)malloc(100 * sizeof(char));
}

int main(void) {
    char *buf;
    
    mys *m = (mys *)malloc(sizeof(mys));
    m->A = (char *)malloc(100 * sizeof(char));

    // getBuf() 반환값을 저장하고 해제
    buf = getBuf();
    if (buf == NULL) {
        printf("메모리 할당 실패\n");
        free(m->A);
        free(m);
        return 1;
    }

    // 적절히 사용한 후 해제
    free(buf);

    // 구조체 내부 메모리 해제
    free(m->A);
    free(m);

    return 0;
}