메모리 구조에 관한 몇가지 정리(C,C++,C# 공통)

DevCho1107

·

2020. 2. 6. 10:23

메모리 구조에 관해 알아보자.


크게 봤을 때 메모리의 구조는 코드 영역, 데이터 영역, 스택 영역, 힙 영역으로 나눌 수 있다. 


이 중 사용자가 관리해야만 하는 영역으로는 힙 영역이 되겠으며, 스택과 데이터 영역은 컴파일 시점에 그 크기가 할당된다. 


음.. 꼬리물리 방식으로 몇가지 개념에 대해 정리해보자. 


스택 오버플로우가 뭔가?



(컴파일시 스택영역의 디폴트크기는 1 Mega 이고, 스택메모리를 확장 할 수 있는데, Visual studio 환경설정에서 가능하다.)

할당된 스택내에 스택프레임이 쌓이게 되는데, 재귀의 무한 반복 등의 이유로 스택영역의 크기를 초과하게 되는 상황을 말하며, 이 때 다른 메모리 영역을 침범하여 데이터의 손실 혹은 예상치 못한 변경을 야기한다. 


스택 프레임이 뭔가?


함수가 호출되면 스택에는 함수의 매개변수, 호출이 끝난 뒤 돌아갈 반환 주소값, 함수에서 선언된 지역 변수 등이 저장되는데, 이렇게 스택 영역에 차례대로 저장되는 함수의 호출 정보를 스택 프레임(stack frame)이라고 한다.

스택 프레임은 익숙한 자료구조 스택과 똑같이 pop과 push로 FIFO방식으로 작동한다는 점에 유의하자. 


전역 변수는 어디에 저장되는가?


전역변수와 정적변수는 데이터영역에 저장된다.


정적변수란 뭔가?


static 키워드로 할당된 변수를 뜻하며, 선언된 블록에서만 접근 하능하나 프로그램이 실행되는 내내 메모리에 유지된다.


스택 오버플로우가 있으면 힙 오버플로우도 있나?


C와 C++에서는 사용자가 힙 메모리의 크기를 관리해야 하는데, 할당한 메모리 크기를 초과하게 되면 똑같이 발생한다. 

C# 에서는 가비지컬렉터를 통해 메모리의 자동 해제가 이루어 지는데, 할당에 있어서는 똑같이 오버플로우가 발생할 수 있다. 


여기서 차이점은 해제에 있어서 C와 C#은 수동 자동의 차이이다.