지역, 전역, 동적 할당 변수란 무엇인가?
//전역 변수
int GlobalVar = 1;
int main()
{
//지역 변수
int LocalVar = 1;
//동적 할당 변수
int* DynamicVar = new int;
*DynamicVar = 1;
return 0;
}
지역 변수
- 특정 구역 내에서 생성되어 그 구역(함수)에서만 사용 가능한 변수.
- 라이프 사이클 : 지역변수가 선언된 함수가 끝날 때 까지
- 할당되는 메모리 구조 : 스택
전역 변수
- 어느 위치에서든 호출하여 사용 가능한 변수.
- 라이프 사이클 : 프로그램이 끝날때까지(컴파일 타임)
- 할당되는 메모리 구조 : 데이터
동적 할당 변수
- 프로그램이 실행되는 런타임 동안 사용자가 직접 공간의 크기나 시점을 결정하여 힙 영역의 메모리를 할당 받은 변수.
- 라이프 사이클 : 런타임
- 할당되는 메모리 구조 : 힙
할당되는 메모리 구조는 무엇을 말하는가?
변수등을 생성하면 메모리에 공간을 할당 받게 되는데 각각 영역이 존재하며 역할이 다름.
STACK : 함수의 호출과 관계되는 지역,매개변수가 저장되는 임시적인 영역. 함수 호출과 함께 할당되며 함수가 끝나면 소멸된다. 그리고 스택의 특성(LIFO - Last In First Out)때문에 가장 최근에 할당된것이 먼저 소멸된다.
HEAP : 사용자가 직접 관리할 수 있는 메모리 영역. 동적으로 메모리를 할당하는 곳이며 메모리의 크기를 프로그램이 실행되는 동안 결정할 수 있다.
DATA : 프로그램의 전역 변수와 정적(Static) 변수가 저장되는 곳. 프로그램이 시작 시 하면 할당이 되며, 종료 시 소멸됨.
CODE : 실행할 프로그램의 바이너리 코드가 저장되는 곳.
동적할당은 왜 하는것일까?
지역변수나 매개변수는 정적할당으로 스택영역에 메모리가 할당되는데, 용량이 큰 데이터를 저장할 경우 스택의 메모리를 초과하여 스택오버플로우를 유발해 에러가 발생할 수 있다. 그렇기 때문에 동적할당을 이용하여 메모리 크기 제한이 없는 힙 영역에 할당하여 위같은 상황을 해결할 수 있다. 하지만 사용이 끝나면 동적할당으로 할당된 메모리를 해제를 잘해야하며 이를 어길시 메모리누수 현상이 발생할 수 있다.
댕글링 포인터란 무언인가?
int main() {
int* A = new int;
int* B = A;
//B가 A를 가르키게 함
delete A;
//A를 할당해제 시킴
//이 타이밍에 댕글링 포인터 문제가 발생
return 0;
}
위처럼 동적할당을 받은 A를 가리키는 B를 만들어 주고 A를 해제해주면 B는 할당이 해제된 메모리를 가리킨다. 이 포인터를 댕글링 포인터(Dangling Pointer)라고 하며 이 포인터를 역참조하면 할당되지 않은 영역에 접근이 될 수 있으므로 이상현상이 생길수 있다. 그러므로 delete 후에 null이나 0값을 넣는 습괍을 가져야한다.
'Game Programming > 자문자답' 카테고리의 다른 글
가비지 컬렉터와 스마트 포인터란 무엇인가? (2) | 2022.09.13 |
---|---|
캐릭터 구현 시 상속을 통해서만 구현해야하는가? (0) | 2022.09.12 |
Call By Value / Address / Reference는 무엇인가? (0) | 2022.09.12 |
가상함수란 무엇인가? (0) | 2022.09.11 |
게임 프로그래밍에서 C++이 사용되는 이유는? (2) | 2022.09.11 |