[따배씨++] 스택과 힙

우리가 작성한 프로그램을 컴퓨터에 실행시키면 운영체제는 메모리를 넘겨 프로그램을 실행시킬 준비를 한다.
이때 메모리는 여러 구역으로 나뉘며 '세그먼트'라고 부르고 세그먼트마다 역할이 다르다.
- 코드 세그먼트: 작성한 프로그램이 저장된다.
- 데이터 세그먼트와 BSS 세그먼트: 데이터 영역에는 Initialized data segment, Uninitialized data segment 두 가지가 있다. 전역 변수와 정적 변수가 들어있다.
- 데이터 세그먼트엔 초기화가 된 전역 변수와 정적 변수가 있다.
- BSS 데이터 세그먼트엔 0으로 초기화 된 전역, 정적 변수가 있다.

코드를 실행시키면 operating system은 main함수를 먼저 실행시킨다.
그리고 코드에서 쓰이는 전역 변수는 가장 먼저 메모리를 차지하고 가장 늦게 사라진다.
코드가 실행되면서 아래에서 위로 스택이 쌓이며 스택에는 프로그램 실행이 끝나면 어디로 돌아가야 하는지에 대한 정보도 들어있다. 실행이 끝나면 위에서 아래 순서로 제거된다.
스택의 장단점
- 속도가 빠른 편이다. 지역 변수를 사용할 때 빠른 속도로 접근해 사용할 수 있다.
- 크기가 작다. int array[1000000]; 이렇게 크기가 큰 배열 사용이 불가하다. 스택이 사이즈가 작기 때문에 사이즈가 큰 변수를 사용하려면 메모리가 넘쳐버린다.(Stack Overflow, 스택 오버플로우) 자잘한 것들을 여러 번 호출하는 경우에도 스택 오버플로우가 일어날 수 있다.
스택의 오버플로우 문제를 보완하기 위해 힙 메모리를 추가로 사용한다.

동적 메모리가 할당되면 힙에 메모리가 잡힌다. 힙은 사이즈가 커서 큰 데이터를 넣을 수 있는 공간이 있다.
하지만 어디에 생길지는 예측하기 어렵다. 메모리를 삭제하는 경우 힙에서 사용한 주소는 OS로 반납이 됐는데 포인터 변수 ptr에서는 아직 어떤 주소를 가지고 있다. 삭제 후 ptr을 역참조해 이용한다면 방금 전 힙에서 이용한 메모리(주소)가 또 다른 곳에서 이용 중일 수 있기 때문에 문제가 생길 수 있다.

이러한 문제를 방지하고자 delete 후 ptr을 다시 nullptr로 만들어주고 이용해야 한다.
delete를 안 한다면?


initArray 함수가 끝나고 Stack에서 나가면 ptr2 변수가 사라진다. 하지만 힙에 메모리가 할당되어 있고 어디에 있는지 모르기 때문에 생겨 쓸 수 없는 메모리가 생기는 문제가 생긴다. 이러한 경우가 반복되면 메모리 누수가 발생한다.