Rylah's Study & Daily Life

Modern C++ : 02. Memory Structure - Heap Memory 본문

Study/C++

Modern C++ : 02. Memory Structure - Heap Memory

Rylah 2022. 2. 3. 10:51

Heap Memory

 

- C++는 프로그래머가 메모리를 관리해야되는 Unmanaged Language

- 관리에 실패하게 되면 생기는 문제 : Memory leak, Memory Fragmentation

 

 * Memory Leak

  - 흔히 말하는 메모리 누수, 프로그래머의 실수로 인해 발생하는 문제라고 생각한다.

  - 사용하고 난 후 해제 되어야 할 메모리가 해제되지 않고 사용되어 발생되는 문제이다.

 

* Memory Fragmentation

 - 사용 가능한 메모리는 충분히 있지만, 할당이 불가능한 상태

 - 외부 단편화, 내부 단편화

 - 내부 단편화 : 할당할 때 프로세스가 필요한 양보다 더 큰 메모리가 할당되어서 메모리 공간이 낭비 된 상황

 - 외부 단편화 : 메모리가 할당되고 해제되는 작업이 반복 될 때 작은 메모리가 중간 중간 존재한다. 

                   그러한 메모리가 많게되어 메모리 공간은 있지만, 실제로 할당이 되지 않는 문제를 외부 단편화라 한다.

 

Stack and Heap

 

Heap Memory를 사용 해야 되는 이유

 

1. Life Cycle

 - 함수가 끝나게 되면 stack 메모리에 있는 내용은 사라지므로 문제가 생긴다.

 - Heap 메모리에 데이터를 관리하고 stack 메모리에서 접근하는 식으로 하면 Life Cycle 문제가 해결이 된다.

 

2. Large Size

 - Stack의 자원은 한정되어 있다.

 -  Stack에서 포인터 변수를 만들어서 포인터만 패스하고, 커다란 문제는 힙 메모리에 할당해서 해결하는 것이 좋다.

 

3. Dynamic(Runtime)

 - 포인터만으로 할당을 받고, 동적으로 프로그램 실행과정에서 결정할 수 있게 된다.

 

#include <iostream>

int main(void)
{
	int* ip;
	ip = new int; // int size 만큼 할당
	*ip = 100; // 100을 할당
	std::cout << ip << "\n";
	std::cout << *ip << "\n";
	delete ip;

	return 0;
}

 

Linux in Ubuntu
MSVC in Windows

1. main 실행

2. stack 메모링 int 포인터 변수 ip 할당

3. ip = new int로 heap에 메모리 할당되었으며 ip가 100인것을 heap 메모리에 있는 변수 ip에 포인터 변수로 대입한다.

4. ip를 할당 해제한다.

5. main 함수가 종료되어 포인터 변수도 해제된다.

 

 

 

 

출처 : https://youtu.be/SwgDv8DG4ao