본문 바로가기
TIL & WIL

[TIL] 크래프톤 정글 4주차 - 동적 메모리 할당(Dynamic Memory Allocation)

by 적용1 2024. 4. 15.
728x90

메모리 동적 할당이란?

- 메모리 동적 할당은 프로그래밍에서 사용하는 변수나 배열은 컴파일 타임에 크기가 결정되는데, 동적 메모리 할당은 런타임 중에 메모리의 크기를 결정하고 할당하는 방식이다.

 

- 예를 들어, 사용자로부터 입력을 받은 크기만큼의 배열을 생성하려는 경우, 동적 메모리 할당을 사용해야한다.

 

- 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() 함수를 통해 해제 시켜줘야한다.

 

참고 : https://gdngy.tistory.com/171

728x90