7장 - 동적 메모리 다루기

1) 동적 메모리 다루기

요즘 프로그래밍 언어들은 자동으로 메모리 관리를 해주는 기능이 있지만, 그래도 동적으로 메모리를 다루는 법을 아는 것과 모르는 것은 차이가 크다. 그러니 알아두도록 하자.

메모리의 4개 구역인 코드, 데이터, 힙, 스택에 관한 내용은 따로 포스팅 하겠다. 우선은 힙과 스택만 구별해보자.

  • 힙(Heap)

    사용자가 직접 관리할 수 있는 메모리 영역이다. 프로그램 실행중에 동적으로 메모리를 할당 및 해제할 수 있다.

  • 스택(Stack)

    지역변수, 매개변수 등 함수의 호출과 관계되는 데이터의 저장 영역이다. 함수의 호출과 함께 할당되며 함수의 소멸과 함께 해제된다.

    int a = 7처럼 변수를 할당한 경우에는 스택에 데이터가 저장되지만, int* a = new int와 같은 경우에 a는 스택, int만큼의 공간 은 힙에 저장된다.

Untitled

힙에서 또다시 힙으로 연결할 수도 있다.

int** handle = nullptr;
handle = new int*;
*handle = new int;

Untitled

스택이야 함수의 소멸과 함께 정리 된다지만, 힙 영역에 메모리를 할당해두고 해제하지 않으면 메모리 누수(memory leak)가 발생한다. 매우 중요한 문제이다.


2) new, delete

C++에서는 new, delete를 사용해서 메모리에 접근한다.

  • new - 힙 영역에 필요한 공간을 할당한다.
  • delete - 사용한 메모리를 해제하여 다시 사용할 수 있게끔 만든다.

그리고 new 공간을 가리키던 포인터를 다 썼으면 nullptr로 바꿔주자.

C에서는 malloc(), free()등을 사용하여 메모리에 접근했다. 물론 C++에서도 쓸 수 있다. 그러나 new, delete쪽이 권장된다.

  • malloc은 단순히 메모리를 할당 ↔ new는 메모리 할당 + 생성자 호출로 객체 생성
  • free는 단순히 메모리 해제 ↔ delete는 메모리 해제 + 소멸자 호출로 객체 제거

참고로 new가 실패할 때도 있는데, 메모리가 부족해서 상황이 매우 좋지 않을 때만 실패한다.