[C++ 7.1.1] 동적 메모리 작동 과정 살펴보기
3~6장은 코드에 대한 설명이 아닌 C++에 관한 이론적인 글들로 이루어져 있어서 과감히 스킵하고
7장부터 쓰기로 하였다.
동적 메모리 다루기.
메모리는 컴퓨터의 로우 레벨 구성요소에 속하지만, C++ 같은 언어에서는 좋지 않다.
동적 메모리 작동 과정
객체가 메모리에 표현되는 방식을 머릿속에 그릴 수 있다면 동적 메모리의 처리과정을 이해하기 쉽다.
메모리 한 칸을 레이블이 달린 상자로 이해하자.
여기서 레이블은 그 메모리를 사용하는 변수 이름에 해당한다.
상자에 담긴 데이터는 변수에 현재 저장된 값이다.
int i = 7;
로컬 변수 i를 자동 변수라고 부르며 스택에 저장된다.
프로그램의 실행 흐름이 변수가 선언된 스코프(유효 범위)를 벗어나면 할당된 메모리가 자동으로 해제된다.
위 코드를 실행한 후의 메모리 상태.
new 키워드를 사용하면 힙 메모리가 할당된다.
다음 코드는 ptr 변수를 스택에 생성하고 nullptr로 초기화한 뒤 ptr이 동적으로 생성된 힙 메모리를 가리키도록 설정한다.
int* ptr = nullptr;
ptr = new int;
간단히 한 줄 코드로 표현하면 다음과 같다.
int* ptr = new int;
앞에 나온 코드를 실행한 후의 메모리 상태를 표현한 것이다.
여기서 ptr 변수는 여전히 스택에 있지만, 이 변수가 가리키는 값은 힙에 있다.
다음 코드는 포인터가 스택과 힙에 모두 있는 예를 보여준다.
int** handle = nullptr;
handle = new int*;
*handle = new int;
여기서는 먼저 정수 포인터에 대한 포인터를 handle 변수로 선언했다.
그다음 정수 포인터를 담는데 충분한 크기로 메모리를 할당한 뒤 그 메모리에 대한 포인터를 handle에 저장했다.
이어서 이 메모리(*handle)에 정수를 담기 충분한 크기의 힙 메모리를 동적으로 할당했다.
두 포인터 중 하나(handle)는 스택에, 다른 하나(*handle)는 힙에 있도록 두 단계로 구성된다.