Game Programming/자문자답

지역, 전역, 동적 할당 변수란 무엇인가?

Doanie 2022. 9. 11. 20:25

지역, 전역, 동적 할당 변수란 무엇인가?


//전역 변수
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값을 넣는 습괍을 가져야한다.