프로그래밍/C++

#45. 동적할당

코딩하는상후니 2022. 7. 20. 22:04

*실행할 코드가 저장되는 영역 => 코드 영역
 
*전역 / 정적 변수  => 데이터 영역
=> 프로그램이 종료될 때까지 '무조건' 사용되는 영역
 
*지역 변수 / 매개 변수  =>  스택 영역
=> 함수가 끝나면 같이 정리되는 불안정한 메모리
 
*동적할당  =>  힙 영역
=> 왜 사용해야할까 ??
=> 스택 으론 엄청난 데이터를 생성할 수 없다.
=> 데이터영역으론 아쉽다.
Player player[ 500 * 1000000 ];
만약 접속자가 1000명이면 ?? , 나머지 데이터는 낭비.
=> 항상 최대 상한선으로 메모리를 잡아야한다는 것이 문제
 
=> 필요할 때만 사용하고, 필요없으면 반납할 수 있는
우리가 생성 / 소멸 시점을 관리할 수 있는 영역
 
 
 

 

 

*유저 영역
메모장, LOL, 곰플레이어  ....
 
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 
*커널 영역 ( Windows 등의 핵심 코드 )
 
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 
 
1. 유저 영역) 에서 운영체제에서 제공하는 API 호출
2. 커널 영역 ) 메모리 할당해서 건내줌
3. 유저 영역 ) ㄳㄳ
 
=> 일단, 한 번 요청할 때 많이 요청하게 됨.
[                            힙 메모리 영역                                              ...    ]
=> 이 영역을 가지고 사용.
 
=> C++ 에서는 기본적으로 CRT ( C 런타임 라이브러리 ) 의 [힙 관리자] 를 통해 힙영역 사용.
단, 정말 원한다면 우리가 직접 API 를 통해 힙을 생성하고 관리할 수도 있음.
( MMORPG 서버 메모리 풀링 )
 
 
 

 

 

*malloc( )
=> 할당할 메모리 크기를 건네준다.
=> 메모리 할당 후 시작 주소를 가리키는 포인터를 반환해준다. ( 메모리 부족일 땐, NULL )
 
 
void* 반환
=> 적당히 알아서 변환해서 사용해라.
 
 
*free
=> malloc ( 혹은 calloc, realloc 등 ) 을 통해 할당된 영역을 해제
=> 힙 관리자가 할당 / 미할당 여부를 구분해서 관리
 
void* pointer = malloc(1000);
Monster* m1 = (Monster*)pointer;
Monster* m2 = (Monster*)malloc(sizeof(Monster));
 
free(m1);
free(m2);
 
 
*Heap Overflow
=> 유효한 힙 범위를 초과해서 사용하는 문제

 
void* pointer = malloc(4);
Monster* m1 = (Monster*)pointer;
m1->_hp = 300;
m1->_y = 20;
m1->_x = 20;
 
free(pointer);

 

*free( ) 하지 않으면 어떻게 될까 ??
=> '메모리 누수'
=> 반납을 계속 안하면 언젠가는 프로그램 전체가 메모리 가용범위를 넘어서 뻗음.
 
 
*free( ) 를 여러번 하면 어떻게 될까 ??
=> Crash
 

 

 
*Use-After_Free
=> 해당 주소 포인터는 가지고 있음.
날라간 메모리임에도 불구하고 포인터로 메모리를 건들 수 있다는 소리
free(m1);
m1 = nullptr  => 해당 주소를 nullptr
이 때, nullptr 를 해주지 않는다면 그 포인터를 '뎅글링 포인터' 라고 함.
 

 
 
 
*new  /  delete
=> 동적할당 / 동적할당 해제.
 
* malloc  /  free  = 함수 ( funtion ) 와 차이점
1. 생성자 / 소멸자 호출
2. 연산자 / 함수 차이 => new / delete 는 연산자 오버로딩 가능.
 
 
*new[ ]  /  delete [ ]
 
Monster* m2 = new Monster(); 
delete m2;

Monster* m3 = new Monster[100]; 
Monster* m4 = (m2 + 1);

m4->_hp = 300; 
delete[] m3;
 
 
*경우에 따라서,
타입에 상관없이 특정한 크기의 메모리 영역을 할당받으려면 ?? => malloc / free
 
 

본 내용은 인프런의 루키스님 강의를 듣고 정리한 내용입니다.

 

'프로그래밍 > C++' 카테고리의 다른 글

#47. 깊은 복사 & 얕은 복사  (0) 2022.07.20
#46. 타입변환  (0) 2022.07.20
#44. 연산자 오버로딩  (0) 2022.07.20
#43. 초기화 리스트  (0) 2022.07.20
#42. 다형성 virtual  (0) 2022.07.19