동적 메모리 다루기
힙과 스택, new, delete
7장 - 동적 메모리 다루기
1) 동적 메모리 다루기
요즘 프로그래밍 언어들은 자동으로 메모리 관리를 해주는 기능이 있지만, 그래도 동적으로 메모리를 다루는 법을 아는 것과 모르는 것은 차이가 크다. 그러니 알아두도록 하자.
메모리의 4개 구역인 코드, 데이터, 힙, 스택에 관한 내용은 따로 포스팅 하겠다. 우선은 힙과 스택만 구별해보자.
-
힙(Heap)
사용자가 직접 관리할 수 있는 메모리 영역이다. 프로그램 실행중에 동적으로 메모리를 할당 및 해제할 수 있다.
-
스택(Stack)
지역변수, 매개변수 등 함수의 호출과 관계되는 데이터의 저장 영역이다. 함수의 호출과 함께 할당되며 함수의 소멸과 함께 해제된다.
int a = 7
처럼 변수를 할당한 경우에는 스택에 데이터가 저장되지만,int* a = new int
와 같은 경우에a
는 스택,int만큼의 공간
은 힙에 저장된다.
힙에서 또다시 힙으로 연결할 수도 있다.
int** handle = nullptr;
handle = new int*;
*handle = new int;
스택이야 함수의 소멸과 함께 정리 된다지만, 힙 영역에 메모리를 할당해두고 해제하지 않으면 메모리 누수(memory leak)가 발생한다. 매우 중요한 문제이다.
2) new, delete
C++에서는 new
, delete
를 사용해서 메모리에 접근한다.
new
- 힙 영역에 필요한 공간을 할당한다.delete
- 사용한 메모리를 해제하여 다시 사용할 수 있게끔 만든다.
그리고 new 공간을 가리키던 포인터를 다 썼으면 nullptr로 바꿔주자.
C에서는 malloc()
, free()
등을 사용하여 메모리에 접근했다. 물론 C++에서도 쓸 수 있다. 그러나 new
, delete
쪽이 권장된다.
malloc
은 단순히 메모리를 할당 ↔new
는 메모리 할당 + 생성자 호출로 객체 생성free
는 단순히 메모리 해제 ↔delete
는 메모리 해제 + 소멸자 호출로 객체 제거
참고로 new
가 실패할 때도 있는데, 메모리가 부족해서 상황이 매우 좋지 않을 때만 실패한다.