💻프로그래밍 내용 정리/C++17

[C++ 7.1.1] 동적 메모리 작동 과정 살펴보기

이이프 2022. 8. 22. 16:12
728x90

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)는 힙에 있도록 두 단계로 구성된다.