[동적 할당]

 

스택 영역은 다량의 메모리를 사용하기에 적합하지 않고, 데이터 영역은 사용자의 이용 여부와 관계없이 무조건 할당되어 사용되기 때문에 비효율적이다.

 

사용자가 원할 때 할당 및 해제해서 사용할 수 있는 영역을 힙 영역이라고 한다.

[ 코드영역  ] [     데이터 영역     ] [ 힙 영역  ] [ 스택 영역 ]

[   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

+ Recent posts