C++
[C++] 메모리 구조
wnstjd
2023. 10. 26. 10:25
왜 알아야 할까
메모리는 프로그램이 실행되며 그에 맞게 할당된다. 할당된 메모리는 한정되어 있기 때문에 잘 관리해 주지 않고 너무 많은 양을 사용하게 되면 프로그램의 속도가 느려지거나 뻗어버린다. 프로그램의 컨텐츠가 아무리 좋아도 메모리 관리가 잘 안돼서 실행이 원활히 되지 않으면 사용자 입장에서는 그냥 쓰레기가 되는 거다. 따라서 개발자는 메모리 관리를 신경 써야 하고 잘 하기 위해서는 메모리 구조를 알아야 하는 것이다.
프로그램 실행 및 작동 원리
메모리 구조를 그냥 외우기 보다는 프로그램의 작동 원리를 이해한다면 메모리 구조를 이해하기 쉬워진다.
프로그램 작동 원리는 이렇다.
- 사용자가 운영체제에 프로그램 실행을 요청한다.
- 운영체제는 하드디스크에 저장된 프로그램을 읽어 메모리의 코드 영역에 저장한다.
- CPU는 메모리의 코드 영역을 읽어 전역 변수, 정적 변수를 저장할 데이터 영역을 할당하고 프로그램을 실행한다.
- 프로그램이 작동되며 실행되는 함수의 매개 변수, 지역 변수, 복귀 주소 등이 스택 영역에 할당된다.
- 프로그래머가 동적으로 생성하고 해제하는 변수들이 힙 영역에 할당된다.
메모리 영역
- 코드 영역 : 프로그램의 코드가 저장되는 영역이다. CPU가 이 영역을 읽어 프로그램을 실행한다.
- 데이터 영역 : 프로그램의 정적 변수, 전역 변수가 저장되는 영역이다. 프로그램이 종료되면 해제된다.
- 힙 영역 : 프로그램에서 개발자가 동적으로 할당하고 해제하는 동적 변수가 저장된다. 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다. 힙 영역이 커질수록 스택 영역이 작아진다.
- 스택 영역 : 프로그램이 작동하며 실행되는 함수의 매개 변수, 지역 변수, 반환 주소값 등이 저장된다. 함수가 종료되면 해제된다. 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다. 스택 영역이 커질수록 힙 영역이 작아진다.
메모리 누수
개발자가 동적 변수를 할당하고 쓸모없어지는 시점에서 해제하지 않아 메모리가 낭비되는 것을 말한다.
메모리 누수가 쌓이면 메모리 자원 반환이 원활이 되지 않아 여러 버그가 발생하거나 프로그램이 종료될 수 있다.
오버플로우
힙 영역이 스택 영역을 침범했거나 스택 영역이 힙 영역을 침범했을 때 발생하는 에러이다.
각각의 경우를 힙 오버플로우, 스택 오버플로우라고 부른다.