Q. 동적 메모리에 관한 질문
무수히 많은 동적 메모리를 할당하다 보면 어느 순간 메모리가 가득 차게 되는 경우가 발생할 수 있는데 어떻게 해결해야 할까요?
malloc() 함수를 이용하여 무수히 많은 동적 메모리를 할당하다 보면 사용하지 않는 메모리들로 인해 어느 순간 할당받을 수 있는 메모리가 없을 수 있다. 이를 해결하기 위해서는 사용하지 않는 메모리는 반드시 해제해야 한다. 메모리를 해제하기 위해서는 <stdlib.h> 헤더파일 내에서 free() 함수를 제공한다.
free() 함수
malloc() 함수로 할당한 메모리는 사용하지 않을 때 free()를 이용하여 해제해야 한다. 해제 하는 방법은 아래와 같다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int size;
char *str;
str = (char*)malloc(7);
strcpy(str, "HELLO!");
printf("%s\n", str);
free(str);
printf("%s\n", str);
return 0;
}
위의 결과를 확인해보면 첫 번째 printf()에서는 HELLO!라는 문장이 출력된다. 하지만, free() 함수를 실행하여 str 변수에 할당된 동적 메모리를 해제한 뒤, printf()를 수행하면 두 번째 printf()에서는 정상적으로 출력이 되지 않는 것을 확인할 수 있다. 이처럼 동적 메모리를 더 이상 사용하지 않는다면 free()를 이용하여 해제하면 된다.
동적 메모리의 위험성
아래의 코드를 한번 살펴보고 문제점을 스스로 생각해 본 뒤 읽어보도록 하자.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int size;
char *str1, *str2;
str1 = (char*)malloc(7);
str2 = (char*)malloc(7);
strcpy(str1, "HELLO!");
strcpy(str2, "STUDY!");
printf("%s %s\n", str1, str2);
str1 = (char*)malloc(10);
strcpy(str1, "COMPUTER");
free(str2);
printf("%s %s\n", str1, str2);
return 0;
}
첫번째 문제점은 동적 메모리가 할당된 str1 변수에 동적 메모리를 다시 할당하여 HELLO! 가 저장된 메모리를 참조할 수 있는 방법이 사라졌다. 즉 HELLO! 가 저장된 메모리는 참조하여 출력, 변경뿐만 아니라 free() 통한 메모리 해제 또한 할 수 없어진다. 이렇게 필요 없는 메모리가 할당되어 있으면 동적 메모리를 사용하는 의미도 사라지게 된다.
두 번째 문제점은 str2 변수를 free() 함수로 메모리 해제했지만 다시 참조하는 경우이다. 위 프로그램에서는 크게 문제 되지 않지만 str2 변수가 참조하고 있던 주소에 운영체제와 관련된 작업이 적재되고, 그 후 다시 참조하게 되면 str2 변수를 이용하여 운영체제 작업에 영향을 끼치는 큰 문제로 이어질 수 있다.
이러한 문제점을 해결하기 위해서는 아래와 같은 규칙을 꼭 지켜야 한다.
1. 사용하지 않는 동적 메모리는 바로 free() 한다. 2. free() 통해 메모리를 반환했다면 참조하던 포인터 변수에 NULL 값을 할당한다. |
문제가 있는 코드를 위의 규칙을 지킨다면 아래와 같이 작성할 수 있다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int size;
char *str1, *str2;
str1 = (char*)malloc(7);
str2 = (char*)malloc(7);
strcpy(str1, "HELLO!");
strcpy(str2, "STUDY!");
printf("%s %s\n", str1, str2);
free(str1);
str1 = (char*)malloc(10);
strcpy(str1, "COMPUTER");
free(str2);
str2 = NULL;
printf("%s %s\n", str1, str2);
return 0;
}
'컴퓨터 이론 > C언어 & 자료구조 & 알고리즘' 카테고리의 다른 글
07. 문자열 함수 라이브러리 (0) | 2023.03.21 |
---|---|
06. 문자열 (0) | 2023.03.21 |
04. 동적 메모리 할당 (0) | 2023.03.20 |
03. 포인터(2) (0) | 2023.02.14 |
02. 포인터 (0) | 2023.02.13 |
댓글