본문 바로가기
한국으로/C++

동적메모리 할당하기 (malloc/free, new/delete)

by 영킴. 2018. 7. 21.

동적할당 malloc과 new의 차이점

malloc(), free()

1. C에서 사용하는 동적할당 함수.
2. 런타임 도중에 공간을 새로 할당받아서 동적으로 메모리를 관리하는 것 (메모리에상에서 heap 공간을 사용함).
3. malloc()과 free()는 함수!


void* malloc(size_t size)

malloc() 함수의 인터페이스. void*를 리턴하기 때문에 반드시 타입캐스팅을 하자!

ex) NODE* p = (NODE*)malloc(sizeof(NODE));  //NODE는 구조체 타입

//NODE* p = (NODE*)malloc(sizeof(NODE*)) 아님!! sizeof(타입의 크기) 잘 지정해서 써주자.

malloc()은 메모리 공간의 할당만을 목적으로 하고, 생성자를 호출하지 않는다. C++에서는 new 연산자를 사용하자.
또한, malloc()과 free() 함수를 쓰려면 <malloc.h> 라이브러리를 추가해줘야 한다.

메모리 할당에 실패하면 NULL이 리턴된다. 예외처리 코딩해주는 것도 좋다.

free()

malloc() 함수를 호출해서 할당받은 메모리는 함수가 종료되더라도 heap 공간에 남아있다. 따라서 그 할당받은 메모리를 효율적으로 관리하려면 free()를 통해 동적할당한 메모리를 해제해야 한다. 메모리를 할당만 하고 해제하지 않으면, 메모리가 부족해지기 때문에 할당된 메모리가 불필요해지면 꼭 free()로 메모리 관리를 해주자.


void* calloc(size_t count, size_t size)

calloc() 함수는 size 크기의 변수를 count 개만큼 저장할 수 있는 메모리 공간을 heap에 할당한다.

malloc() 함수와 차이점은, malloc() 은 할당된 공간의 값을 쓰레기값으로 반환하지만, calloc() 은 할당된 공간의 값을 모두 0으로 초기화시켜준다. 따라서 초기화된 메모리 공간이 필요할 경우 사용하자 (malloc() 함수보다 느릴 수는 있다).


void* realloc(void* memblock, size_t size)

이미 할당한 포인터 변수를 memblock에 넣고, 바꾸고 싶은 공간의 크기 size 를 입력한다.

ex) 
  int* ptr = (int*)malloc(sizeof(int) * 10);  //malloc()으로 먼저 int [10] 배열만큼 메모리를 할당해주었다.
  ....
  realloc(ptr, sizeof(int) * 100);  //ptr이 가리키는 메모리공간을 400B (int [100]) 만큼 재할당할 수 있다.





new, delete

1. C++에서 동적할당을 위해 사용하는 '연산자'
2. C++의 연산자 오버로딩 기능을 사용할 수 있음.


new

new연산자를 사용해 동적할당하는 방법. 할당할 메모리 크기를 몰라도 되기 때문에 타입캐스팅이 불필요하다.

ex) int* ptr = new int;  //int형 변수할당

new 연산자를 사용해서 class를 할당할 경우, 메모리 공간도 할당하고, 생성자를 통한 초기화도 가능해진다.


delete

C의 free() 함수처럼 동적할당된 메모리를 해제시킨다.