티스토리 뷰
메모리의 구조
프로그램이 실행되면 운영체제가 메모리(RAM)에 공간을 할당한다.
프로그램이 운영체제로부터 할당받는 대표적인 메모리 공간엔 4가지가 있다.
1. 코드(code) 영역
- 함수, 제어문, 상수 등이 저장된다. 우리가 작성한 소스코드가 들어가는 부분.
- 텍스트영역이라고도 부른다.
2. 데이터(data) 영역
- 전역변수와 static 변수가 저장된다.
- 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸한다.
3. 스택(stack) 영역
- 지역 변수와 매개변수가 저장된다.
- 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다.
- 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다.
- 컴파일 시에 크기가 결정된다.
4. 힙(heap) 영역
- 사용자가 직접 관리하는 영역. 사용자에 의해 메모리 공간이 동적으로 할당, 해제된다.
- 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.
- 런타임 시에 크기가 결정된다.
스택 영역과 힙 영역은 같은 공간을 공유한다. 스택 영역이 클수록 힙 영역이 작아지고, 힙 영역이 클수록 스택 영역이 작아진다.
각 영역이 상대 공간을 침범하는 것을 각각 힙 오버플로우, 스택 오버플로우라고 한다.
ex) 재귀 무한루프 스택오버플로우
런타임, 컴파일타임에 결정되는 과정 설명
[C] 스택(Stack), 힙(Heap), 데이터(Data)영역
정적할당과 동적할당
정적할당
char name[5];
단점
1. 변수가 실제로 사용되지 않으면 낭비되는 메모리가 많다.
2. 용량 제한으로 인한 스택오버플로우
3. 할당한 한계를 초과해서 삽입할 수 없다.
동적할당 - new, delete
new int;
int *ptr = new int;
new 연산자는 주소값을 반환하기 때문에 포인터로 받는다.
*ptr = 7;
포인터를 역참조하여 메모리에 접근한다.
delete ptr;
ptr = 0; // 댕글링포인터 방지
힙 메모리의 데이터는 명시적인 해제가 필요하다. C++에서는 delete 연산자를 사용하여 메모리를 해제한다. 해당하는 메모리를 다시 운영체제로 반환하는 것이기 때문에, 다른 해당 메모리를 다른 곳에 재할당할 수 있다.
* 댕글링 포인터
동적 할당에서 메모리가 해제된 곳을 가리고 있는 포인터. 댕글링 포인터에 접근하면 정의되지 않은 동작이 발생하는 문제가 있다. 이를 방지하기 위해서는 메모리 해제 후에 반드시 포인터 변수를 NULL로 초기화해준다.
'42 > cpp' 카테고리의 다른 글
[C++] NULL 포인터로 객체의 함수가 호출되는 이유 (0) | 2021.07.21 |
---|---|
생성자, 복사생성자, 복사대입연산자, 소멸자 (0) | 2021.05.27 |
참조자 (0) | 2021.05.26 |
객체지향, 접근지정자 (0) | 2021.05.25 |
네임스페이스, 표준입출력 (0) | 2021.05.18 |