세리프 따라잡기

WEEK05 - TIL 메모리 동적할당 / 메모리 누수 본문

SW사관학교 정글

WEEK05 - TIL 메모리 동적할당 / 메모리 누수

맑은 고딕 2022. 5. 1. 19:37

#malloc / free / colloc 함수 참고

#메모리 동적할당 참고

 

 

메모리 동적할당이란?

= 프로그램이 작동하는 도중에 할당받고자 할 때 사용하는 방법, 동적 할당된 메모리는 힙(heap)영역에 malloc과 free를 사용해 할당되고 해제된다.

 

각 칸을 4바이트 차이만큼 표시한 이유는 32bit 시스템의 경우엔 포인터의 사이즈가 4byte이기 때문에

64bit인 경우엔 CPU의 메모리 접근을 위한 주소가 64bit 만큼 가능하기 때문에 8byte가 된다.

 

파란색 부분은 할당된 부분, 흰색 부분은 할당이 해제된 부분. 그림은 차례로 할당과 해제된 부분을 그렸지만, 할당된 부분들은 얼마든지 연속적으로 붙어있거나 떨어져있을 수 있다.

but, 할당 해제된 부분은 단편화 문제를 해결하기 위해 연속적으로 존재할 수 없다.

 

단편화(fragmentation)란?

쉽게 말해 사용하지 않거나 사용하지 못하는 메모리가 쌓여 메모리 누수를 유발할 수 있는 경우들

 

+ 메모리 누스(memory leak) 현상은 컴퓨터 프로그램이 필요하지 않은 메모리를 계속 점유하고 있는 현상이다. 할당된 메모리를 사용한 다음 반환하지 않는 것이 누적되면 메모리가 낭비된다.

즉, 더 이상 불필요한 메모리가 해제되지 않으면서 메모리 할당을 잘못 관리할 때 발생하는 걸 말한다.

 

malloc() 함수
malloc 함수는 프로그램이 실행 중일 때 사용자가 직접 힙 영역에 메모리를 할당할 수 있게 해준다.


malloc() 함수는 인수로 할당받고자 하는 메모리의 크기를 바이트 단위로 전달받는다.
malloc은 전달받은 메모리 크기에 맞고, 아직 할당되지 않은 적당한 블록을 찾는다.
이렇게 찾은 블록의 첫 번째 바이트를 가리키는 주소값을 반환한다.
만약 힙 영역에 할당할 수 있는 적당한 블록이 없을 때는 널(NULL) 포인터를 반환한다.

+ free() 함수

free() 함수는 힙 영역에 할당받은 메모리 공간을 다시 운영체제로 반환해주는 함수


데이터 영역이나 스택 영역에 할당되는 메모리의 크기는 컴파일 타임에 결정되어 프로그램이 실행되는 내내 고정된다.
근데 메모리의 동적 할당으로 힙 영역에 생성되는 메모리의 크기는 런타임 내내 변화한다.
따라서 free() 함수를 사용해 다 사용한 메모리를 해제해주지 않으면 메모리가 부족해지는 현상이 발생할 수 있다.
→ 사용이 끝난 메모리를 해제하지 않아서 메모리가 부족해지는 현상을 메모리 누수(memory leak)라고 한다.

 

+ colloc() 함수

colloc 함수는 malloc 함수와 마찬가지로 힙 영역에 메모리를 동적으로 할당해주는 함수

 

이 함수가 malloc과 다른 점은 할당하고자 하는 메모리의 크기를 두 개의 인수로 나누어 전달받는 점이다.

colloc 함수는 메모리를 할당받은 후 해당 메모리의 모든 비트값을 전부 0으로 초기화해준다.

calloc 함수도 malloc 함수와 마찬가지로 free 함수를 통해 할당받은 메모리를 해제해주어야 한다.

calloc 함수의 첫 번째 인수는 메모리 블록의 개수를 나타내며 두번째 인수는 각 블록의 바이트 수를 나타낸다.

그래서 calloc 함수는 힙 영역에 size 크기의 메모리 블록을 nmemb개 할당받을 수 있게 요청한다.

 

nmemb == number of members이고
간단하게 count라고 생각하면 된다. == 개수

 

+ realloc() 함수

realloc 함수는 이미 할당된 메모리의 크기를 바꾸어 재할당할 때 사용하는 함수

 

realloc 함수의 첫번째 인수는 크기를 바꾸고자 하는 메모리 공간을 가리키는 포인터를 전달받습니다.

두번째 인수로는 해당 메모리 공간에 재할당할 크기를 전달한다.

만약 첫 번째 인수로 null이 전달되면, malloc 함수와 정확히 같은 동작을 하게 된다.

realloc 함수는 만약 기존의 메모리 위치에 충분한 공간이 있다면 바로 이어서 추가 메모리 공간을 할당해주지만, 기존의 메모리 위치에 충분한 공간이 없으면 메모리의 다른 공간에 기존의 데이터를 복사한 후 이어서 추가 메모리 공간을 할당하게 된다.

 

+ malloc 함수와 calloc 함수의 차이점

비교의 기초 malloc() calloc()
블록 수 요청 된 메모리의 단일 블록을 할당 요청 된 메모리의 여러 블록을 할당
통사론 void * malloc (size_t size); void * calloc (size_t num, size_t size);
초기화 malloc ()은 할당 된 메모리를 초기화하지 않는다 할당 된 메모리는 calloc ()을 사용하여 0으로 초기화
배분 방식 malloc () 함수는 힙에서 '크기'크기의 메모리를 할당 calloc () 함수는 크기가 num * size 인 메모리를 할당
속도 빠른 비교적 천천히

- 요청된 메모리의 단일 블록은 malloc에 할당되는 반면, 요청 된 메모리의 여러 블록은 calloc에 의해 할당된다

- malloc 함수는 할당된 메모리를 지우거나 초기화하지 않는다. 그것은 쓰레기 값을 포함하고 할당 된 메모리의 항목은 변경할 수 없다. 반대로 calloc은 할당된 메모리를 0으로 초기화 한다.

- malloc은 calloc보다 빠른 초기화 단계가 필요하기 때문에 calloc보다 빠르나 차이는 무시할만하다.

- 또 다른 차이점은 calloc은 malloc + memset이고 memset은 물리적 페이지를 메모리에 할당하는 반면 malloc은 가상 주소의 힙에있는 메모리 만 할당한다는 것

 

++ 차이점의 결론

∴ malloc과 calloc 함수는 모두 메모리를 할당하는 데 사용되며 특정 이점이 있으며 malloc과 같은 단점은 calloc에 ​​비해 빠릅니다. 게다가 calloc은 메모리를 할당하고 메모리 영역을 0으로 초기화하기 때문에 malloc은 사용하기가 더 쉽다. 그러나 변수 초기화 가 더 중요 할 때 calloc을 사용하는 것을 선호한다.

 

 

Comments