학부생 때 공부했던 내용을 다 까먹었다... 다시 잘 정리하고 머리 속에 집어 넣어보자.
프로그램이 실행되는 과정은 다음과 같다.
위 3번 과정에서 프로그램이 운영체제로부터 할당 받는 메모리는 다음과 같이 4가지로 나뉘어져 있다.
개발자가 작성한 소스 코드가 기계어 형태로 저장되는 공간
즉, 실행할 프로그램의 코드가 Code 영역에 저장된다.
CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리한다.
Text 공간이라고도 불린다.
초기화된 전역 변수와 정적(static) 변수가 저장되는 공간
프로그램 시작과 동시에 할당되고, 프로그램이 종료되면 해제된다.
개발자가 직접 할당/해제 하는 공간
malloc, new 등을 통해 동적으로 할당되는 변수들이 여기에 저장된다.
사용하고 난 뒤 꼭 메모리를 해제 시켜줘야 한다.
사용하지 않는 메모리를 해제 시켜주지 않으면 memory leak이 발생
낮은 주소에서 높은 주소의 방향으로 할당된다.
Stack의 영역을 침범하면, Heap overflow 발생
Swift에서 클래스 인스턴스, 클로저 같은 참조 타입 들은 Heap에 자동으로 할당된다. 그리고 ARC를 통해 힙에 할당된 메모리가 더이상 참조되지 않으면 자동으로 해제해준다. (ARC가 뭔지 공부 필요 !)
참조 타입이란?
객체의 주소를 메모리에 저장해서 사용할 때 그 주소를 참조 하는 타입
함수 호출과 관련있는 지역 변수, 매개 변수, 리턴 값 등이 저장되는 공간
함수 호출이 완료되면 메모리도 해제된다.
컴파일 타임에 결정되기 때문에 무한히 할당할 수 없다.
Heap과 반대로 높은 주소에서 낮은 주소의 방향으로 할당된다.
함수를 재귀 호출 할 때 Stack 영역에 해당 함수의 지역 변수, 매개 변수들이 계속 할당되다보면 Stack 영역을 넘어버려서 Stack overflow가 발생한다.
https://babbab2.tistory.com/25
http://www.tcpschool.com/c/c_memory_structure