728x90
동적 할당이란?
- 필요할때만 사용하고, 필요없으면 반납할수 있는!
- 그러면서도 (스택과는 다르게) 우리가 생성/소멸 시점을 관리할수 있는!
- 그런 아름다운 메모리 없나? -> HEAP
- 동적할당과 연관된 함수/연산자 : malloc, free, new, delete, new[]. delete[]
유저 영역[메모장][게임][곰플레이어 등]
-------------------------------------------------
커널 영역(Windows 등의 핵심 코드)
컴퓨터가 위 처럼 실행되고 있다고 한다면
유저영역) 운영체제에서 제공하는 API 호출
커널영역) 메모리 할당해서 건내줌
유저영역) 건네준 메모리 잘사용
C++에서는 기본적으로 CRT(C런타임 라이브러리)의 [힙관리자]를 통해 힙 영역 사용
단, 정말 원한다면 우리가 직접 API를 통해 힙을 생성하고 관리할 수도 있음
malloc
- 할당한 메모리 크기를 건내준다
- 메모리 할당 후 시작 주소를 가리키는 포인터를 반환해준다 (메모리 부족시 NULL 반환)
- void*은 타고가면 뭐가있는지 모르겠으니까 니가 적당히 변환해서 사용해라 라는 의미로 사용
class Monster
{
public:
int _hp;
int _attack;
int _defence;
};
int main()
{
void* pointer = malloc(1000); // 1000바이트 힙 메모리를 할당받음
Monster* m1 = (Monster*)pointer;
m1->_hp = 100;
m1->_attack = 10;
m1->_defence =1;
return 0;
}
void* pointer = malloc(1000); 이 부분이 메모리가 낭비가 될수도 있으니
void* pointer = malloc(sizeof(Monster)); 이렇게 하면 낭비가 되지 않음
free
- malloc(혹은 기타 calloc, realloc 등의 사촌 을 통해 할당된 영역을 해제
- 힙 관리자가 할당/ 미할당 여부를 구분해서 관리
- free(pointer); = 메모리를 더이상 사용하지 않을테니 놓아줘!
free를 사용하지 않으면 메모리 누수가 발생함
free를 두번 사용하면 Double Free 라고 하는데 크래시가 나게됨.
**Use-After-Free**
크래시가 나지않고 다른메모리를 건드리게 될경우
- 프로그래머 입장 : OMG 망했다.
- 해커 입장 : 심봤다
그렇기 때문에 m1 = nullptr; 등을 넣어줘 메모리를 잘 정리해야한다.
new / delete
- C++에 추가됨
- malloc / free 함수처럼 new/delete 는 연산자(operator)! 짝지어서 써줘야함
- malloc / free 와 비슷한 버그들은 공통적으로 존재
new[ ] / delete [ ]
- new가 malloc에 비해 좋긴한데 배열과 같이 N개 데이터를 같이 할당할때 사용
int main()
{
Monster* m2 = new Monster;//타입의 크기만큼 할당해줌
m2->_hp = 200;
m2->_attack = 20;
m2->_defence = 2;
delete m2;
Monster* m3 = new Monster[5]; //타입의 크기만큼 5개를 할당해줌
m2->_hp = 300;
m2->_attack = 30;
m2->_defence = 3;
delete[] m3;
return 0;
}
이전에 배운 포인터 연산자를 이용하면
Monster* m4 = (m3 + 1); 의 의미는 m3 의 다음 주소를 사용하겠다. 로 해석할 수 있음
malloc /free vs new/delete
- 사용편의성 -> new/delete 승
- 타입에 상관없이 특정한 크기의 메모리 영역을 할당 받으려면? -> malloc / free 승
- 그런데 둘의 가장 근본적 중요한 차이는 new / delete 는 (생성타입이 클래스일경우) 생성자/소멸자를 호출해준다!
728x90
댓글