[C++] Stack and Heap(feat. Memory Leak)

2021. 2. 11. 19:45Study/C&C++

Stack and Heap

프로그램 실행시 컴퓨터가 내부에서 사용하는 메모리들중 Stack과 Heap이 있다.

이번에는 우리의 코드가 Stack과 Heap에 어떻게 들어가는지 알아보고 나아가 Memory leak 에대해 알아보겠다


기본구조

 

이처럼 코드가 메모리의 제일 아래에 있다 하면. 

프로그램이 시작될때

.BSS - 초기화되지 않은 전역,Static변수들이 차지한다.

.Data - 초기화된 전역,Stacic변수들이 차지한다.

그후, 

프로그램이 실행되면서 Stack 과 Heap에 메모리를 쓰게 된다.

Stack

Stack 은 프로그램이의 코드들이 한줄씩 실행되면서 각각의 Scope, 그내부의 Local variable 이 들어오는 자리이다. 

ex) { }, functions, for{} while{}

 

제일위엔 현재 실행 되고 있는 부분이 들어있고 순서대로 빠져 나가며 제일 마지막엔 제일 처음 호출했던 scope 가 차지한다.

하지만 상대적으로 크기가 작아 만약 큰 배열을 할당하거나, 여러 scope 들이 실행되어 Stack 이꽉차면

이때 Stack Overflow 가 발생한다

Heap

stack 의  작은 size를 보완 해줄수 있는 메모리이다.

 

 

한 scope 에서 Pointer 변수에게 new 를 이용하여 Heap에 있는 메모리를 할당 받는다. 

OS 는 Heap 에서 적당한 공간에 메모리를 할당하여 그 첫 주소를 리턴해준다.

그후 우리는 Stack에서 Pointer 변수를 이용하여 heap에 접근하여 메모리를 사용 하게된다.

 

하지만 Scope 가 끝나 Stack에 할당된 Pointer 변수가 사라지면 어떻게될까? 

 

Memory Leak

이때 메모리 누수가 일어난다.

우리는 Heap에 메모리를 할당받고 Stack 에 있는 변수에 주소를 저장 해놨는데.

Scope 가 끝나면서 이 주소가 저장되어있는곳, 주소 모두 사라지게 된다.

 

즉, Heap에 할당받은 메모리는 그대로 남아 있는데 사용,삭제 할수 없게 된 것이다.

 

C++ 에서 다양한  Container 들을 지원해주고 , 그 내부 소멸자에서 자동으로 delete를 해주기 때문에 크게 걱정할 필요가 없긴 하지만. new 를 했으면 delete 를 해주는 습관을 가지자. 

또한 이때문에 최신 언어들은 garbage colloection을 지원하는것 같다.

 

또 너무 잦은 new 와 delete는 프로그램을 느리게 할 수있다.  

이 문제는 Capacity와 length를 따로 다루어 해결할 수 있다.

 

요약

1. stack : 지역변수들, { } 내부  코드

2. heap : new로 확보, 주소 받음,  delete 로 지워야함

3. 메모리 누수란 : 할당받은 메모리에 접근할 방법이없음 

'Study > C&C++' 카테고리의 다른 글

[C++] std::cin, getline()  (0) 2021.02.22
[C++]R-value Reference,move Sementics  (0) 2021.02.20
[C++] l-value,r-value  (0) 2021.02.14
[C++] C -style string , std::string  (0) 2021.02.11
[C++] Pointer vs Reference  (0) 2021.02.11