메모리 동적 할당이란?
- 메모리 동적 할당은 프로그래밍에서 사용하는 변수나 배열은 컴파일 타임에 크기가 결정되는데, 동적 메모리 할당은 런타임 중에 메모리의 크기를 결정하고 할당하는 방식이다.
- 예를 들어, 사용자로부터 입력을 받은 크기만큼의 배열을 생성하려는 경우, 동적 메모리 할당을 사용해야한다.
- C언어에서는 malloc, calloc 등을 이용해서 동적 메모리 할당을 할 수 있고, realloc을 이용하여 재할당을 할 수 있다.
동적 할당을 사용하는 이유
- 동적 할당을 하면 프로그램의 유연성을 높이며, 데이터의 크기가 런타임에 결정될 때 유리하다.
- 더 깊게 설명하려면 스택 메모리와 힙 메모리에 대해 설명해야한다.
1) 스택 메모리(stack memory)
· 스택 메모리는 컴파일 타임에 크기가 결정되는 변수들이 저장되는 공간이다.
· 함수가 호출될 때마다 새로운 스택 프레임이 호출되며, 그 안에는 함수의 지역 변수, 매개변수 등이 저장된다. (CS:app 글을 통해서 자세한 내용을 볼 수 있다.)
· 함수가 종료되면 함수의 스택 프레임은 소멸되며, 그 안의 변수들도 함께 소멸한다. 즉, 스택 메모리가 컴파일러에 의해 자동으로 관리되는 것을 알 수 있다.
2) 힙 메모리(heap memory)
· 힙 메모리는 런타임에 크기가 결정되는 데이터가 저장되는 공간이다.
· 힙 메모리는 개발자가 직접 관리해야 하고, 필요한 크기의 메모리를 동적으로 할당하고 사용한 뒤에는 반드시 해제해야한다.(메모리 누수 방지)
- 동적 할당하는 변수와 메모리는 모두 힙 메모리에 저장되기 때문에 더 유연하게 사용할 수 있지만, 반드시 메모리 해제를 해줘야 하는 단점이 있다.
C언어에서의 동적 할당, 재할당, 해제
1) malloc(메모리 할당)
void *malloc(size_t size)
· malloc 함수는 할당 받을 메모리 크기를 인자로 받고, void형 포인터를 return 한다.
· 따라서 할당 받을 메모리 크기에는 사용할 변수의 size * 개수를 넣어야하고, 반드시 가리킬 변수의 타입에 맞게 typecasting을 해줘야한다.
ex) int형 변수를 4개 넣는 공간을 할당 받고 싶으면 int* ptr = (int*)malloc(sizeof(int) * 4); 와 같이 사용해야한다.
2) calloc(메모리 할당 및 초기화)
void *calloc(size_t nitems, size_t size)
· calloc 함수는 사용할 변수의 개수, 사용할 변수의 size를 인자로 받고, void형 포인터를 return 한다.
· malloc 함수와 비슷하지만 calloc 함수는 메모리를 할당받고, 할당 받은 메모리에 0을 저장한다.
· int형 변수로 형 변환(type casting)을 하던, char형 변수로 형 변환을 하던 메모리에 저장되는 값은 0이다.
ex) char형 변수를 4개 넣는 공간을 할당 받고 그 공간에 저장되는 값을 0으로 초기화 하고 싶으면
char* ptr = (char*)calloc(4, sizeof(char)); 와 같이 사용해야한다.
3) relloc(메모리 재할당)
void *realloc(void *ptr, size_t size)
· realloc 함수는 할당받은 메모리 주소를 가리키는 포인터와 재할당 받을 메모리의 크기를 인자로 받고, void형 포인터를 return한다.
· realloc 함수는 위 2개의 함수와 다르게 인자에 int형 포인터, char형 포인터와 같이 이미 type이 정해진 포인터를 넣어준다면, 형 변환을 해줄 필요가 없다.
4) free(메모리 해제)
void free(void *ptr)
· free 함수는 malloc, calloc, realloc 으로 할당 받은 메모리 주소를 인자로 받으면, 해당 메모리 주소에 할당된 메모리를 해제(반환)해주는 함수이다.
· 만약 null 포인터를 인자로 받게 되면 아무 일도 일어나지 않는다.
· C에서 메모리를 할당 받았을 때에는 반드시 free를 해주어야한다. 그러지 않으면 메모리 누수가 발생하게 된다.
메모리 누수
- 메모리 누수는 프로그램에서 동적으로 할당된 메모리를 필요하지 않는 상태임에도 그 메모리를 해제하지 않는 현상을 말한다.
- 메모리 누수는 프로그램이 실행되는 동안 메모리 사용량을 불필요하게 증가시키고, 궁극적으로는 시스템의 전반적인 성능을 저하시키는 결과를 초래할 수 있다.
- 메모리 누수를 방지하기 위해서는 반드시 할당받은 메모리를 free() 함수를 통해 해제 시켜줘야한다.
'TIL & WIL' 카테고리의 다른 글
[TIL] 크래프톤 정글 5주차 - 자료구조(RB Tree) (1) | 2024.04.20 |
---|---|
[TIL] 크래프톤 정글 5주차 CS:app 7(링커 Linker) (0) | 2024.04.19 |
[TIL] 크래프톤 정글 3주차 CS:app 6(배열의 할당과 접근) (0) | 2024.04.14 |
[TIL] 크래프톤 정글 3주차 CS:app 5(Procedure) (0) | 2024.04.14 |
[TIL] 크래프톤 정글 3주차 CS:app 4(메모리에서의 정보 접근) (0) | 2024.04.14 |