#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;
}
'2학년 2학기 > c언어' 카테고리의 다른 글
13-11장 Wild pointer (0) | 2024.11.26 |
---|---|
13-10장 Dangling pointer (0) | 2024.11.26 |
13-8장 메모리 누수(2)_이미 해제된 동적 메모리 영역을 다시 해제 하려고하는 경우 (0) | 2024.11.26 |
13-7장 메모리 누수(1)_fread가 실패해서 free를 실행하지 못하는 경우 (0) | 2024.11.26 |
13-6장 동적 할당에서의 대표적인 오류들 (0) | 2024.11.25 |