1 분 소요

동적 메모리 할당

기본적인 개념은 프로그램이 ‘실행시간 동안 사용할 메모리 공간을 할당하는 것’을 뜻한다

프로그램이 실행되기 전, 컴파일 시점에서 소스 코드를 읽고,
메모리 공간을 확보하는 것은 ‘정적 메모리 할당’이라 한다

이렇게 할당된 공간은 가상 메모리의 ‘힙’ 영역에 위치하게 되고
명시적인 해제 (명시적 할당기를 통한 할당/해제 ex : C의 malloc / free, C++의 new/delete)
혹은 Garbage Collector가 수집을 해주기 전까지 계속 할당 상태가 된다
(GC는 할당된 영역을 ‘참조’하는지를 판단하며, 이에 따라서 할당해제할 영역을 판단한다 )

동적 메모리 할당의 필요 이유

  • 프로그램 실행 중, 같은 코드 이지만 필요한 메모리가 다른 경우가 있을 수 있음
    => 동적 메모리 할당 시, 코드가 유연해진다
  • 정적으로 할당된 메모리는 스택 or data 영역에서 지속적으로 메모리를 차지하지만
    동적으로 할당된 메모리는 사용 후, 반환이 가능하기에
    효율적으로 메모리를 사용할 수 있음
  • 일부 데이터 구조는 ‘동적’으로 크기가 바뀌는 것이 전제이기에
    이러한 데이터 구조를 유용하게 사용할 수 있음
    (ex : Tree, 연결 리스트, vector 등등)
  • 힙 영역은 스택 프레임과 달리, 할당 해제가 일어나기 전까지는
    데이터가 유지되므로, 각 컴포넌트가 데이터를 공유/참조하기 유리하다
  • 필요한 메모리를 입력받아 정확하게 선언하므로
    정적 할당보다 메모리를 더 콤팩트하게 사용할 수 있음

힙 영역

동적으로 메모리가 할당되는 영역이다
(스택과는 달리 자료구조와는 관련이 없다)

기본적으로 메인 메모리에 할당이 된다

C에서는 malloc, calloc으로 할당,
realloc으로 재할당이 가능하며
free로 할당 해제가 가능하다

참고로 free를 사용하지 않는 경우,
프로그램 종료 시까지
해당 힙 영역은 할당 해제가 일어나지 않는다
(프로그램 종료하면 OS가 가져가 준다)
당연히, free 호출하지 않는 것은
해당 프로세스 뿐 아니라 같이 실행되는 다른 프로세스에
악영향을 줄 수 있다는 점을 명시하고
free()를 제대로 호출해주자
(같이 쓰는 메인 메모리 공간을 소중히 여기자)

동적 메모리 할당기

할당기는 힙을 다양한 크기의 블록 집합으로 관리한다
힙 영역의 각 블록은 할당된 상태(Allocated)
혹은 가용 상태 (Free) 이다

malloc,free 등을 이용하여,
프로그램에서 직접 동적 메모리 할당을 요청하는것을
‘명시적 할당’이라 한다

  • malloc
    C 표준 라이브러리는 malloc이라는 명시적 할당기를 제공한다
    malloc을 통해 heap으로부터 메모리 블록을 할당 받음
    (해당 메모리 블록은 초기화되지 않은 상태이다)
    (0으로 초기화된 것을 원한다면 calloc을 사용하자)
    (이미 할당된 메모리의 사이즈를 변경하고 싶다면 realloc으로 재할당하자)
  • free
    할당된 힙 블록을 free로 반환한다
    매개 변수로 할당된 블록의 ‘시작 주소’를 받는다
    (다만 void 반환형이기에, 성공여부를 알 수는 없음)
    free로 초기화 한 이후,
    매개변수로 집어넣은 포인터는 ‘댕글리’ 포인터가 되어
    (유효하지 않은 주소를 가리키는 포인터)
    사용하지 말거나, NULL로 초기화해주는 것이 권장된다

  • sbrk
    커널의 brk 포인터(힙의 꼭대기를 가리키는 변수)에
    매개변수(int)로 받은 만큼 더해주어 반환한다
    다만 매개변수가 음수이거나, 더한 주소값이
    힙의 총 량을 가리키는 변수값을 넘어버린다면
    -1을 리턴한다

댓글남기기