[동적 할당]
스택 영역은 다량의 메모리를 사용하기에 적합하지 않고, 데이터 영역은 사용자의 이용 여부와 관계없이 무조건 할당되어 사용되기 때문에 비효율적이다.
사용자가 원할 때 할당 및 해제해서 사용할 수 있는 영역을 힙 영역이라고 한다.
[ 코드영역 ] [ 데이터 영역 ] [ 힙 영역 ] [ 스택 영역 ]
[ code ] [.data][.bss][.rodata] [ heap ] [ stack ]
C++에서는 기본적으로 CRT(C Runtime Library)의 힙 관리자를 통해 힙 영역을 사용한다.
정말 원한다면 직접 API를 통해 힙을 생성하고 관리할 수도 있다. (ex: MMORPG 서버 풀링)
malloc - free
malloc
메모리 할당 후 시작 주소를 가리키는 void형 포인터를 반환해준다.
메모리가 부족하면 null을 반환한다.
free
메모리 해제시 크기를 지정하지 않아도 알아서 해제되는 이유는 할당할 때 헤더 영역을 추가로 만들어서 정보를 보관해두기 때문이다.
같은 메모리를 두 번 해제하는 것을 double free라고 하는데 보통 크래시만 발생한다. 첫 번째 free시 헤더 영역의 정보까지 모두 날아가므로 두 번째 free는 정보가 없어서 해제를 할 수가 없다.
use after free가 발생하는 것을 유의해야 한다.
new - delete
malloc-free는 함수이고 new-delete는 연산자이다.
사용 편의성은 new-delete가 좋지만 타입에 상관없이 특정한 크기의 메모리 영역을 할당 받으려면 malloc을 이용해야 한다.
malloc-free와 new-delete의 결정적인 차이
"new-delete는 생성 타입이 클래스인 경우 생성자와 소멸자를 호출해준다."
'C++ > Rookiss C++' 카테고리의 다른 글
[동적 할당] 얕은 복사 vs 깊은 복사 (0) | 2022.08.29 |
---|---|
[동적 할당] 타입 변환 (0) | 2022.08.29 |
[객체지향 여행] (0) | 2022.08.28 |
[포인터] #2/2 (0) | 2022.08.27 |
[포인터] #1/2 (0) | 2022.08.26 |