[c/c++] malloc vs new

마이구미·2021년 11월 1일
0

c언어에서 동적할당을 하기 위해서는 malloc, calloc 을 사용한다. c++은 new 라는 연산자가 존재하는데 차이가 무엇인지 알아보자.

malloc과 free

C에서는 동적 할당을 위해서 malloc함수와 free 함수를 쓴다. malloc의 경우 함수로 stdlib.h 헤더파일에 포함되어 있어 사용하려면 "stdlib.h" 헤더를 반드시 포함해야 된다. malloc 함수는 입력받은 바이트 크기 만큼 메모리 공간을 Heap Memory에 할당해준다. malloc은 타입의 크기를 정확히 알고 써야 제대로 쓸 수 있다. char 형은 1 byte, double은 8byte다. 포인터 배열을 동적으로 할당 할 때도 마찬가지다. 배열의 크기 타입의 byte size 만큼의 크기로 해야된다. 그리고, malloc 함수의 타입이 void 형이므로, 미리 각 타입에 맞게 캐스팅, 타입 변환을 해줘야 나중에 타입변환을 하지 않는 번거러움을 덜 수 있다. 또한 C에서는 Garbage Collector 가 없으므로, 사용자가 수동으로 동적 할당한 메모리를 수거 해야한다. 만약 malloc으로 메모리를 동적으로 받아 놓고 해제 해주지 않는다면, 메모리 누수 현상으로 인해 운영체제가 멈추는 경우도 발생한다. (이런 현상은 16비트 운영체제에서 빈번히 일어난다고 한다. 32비트 이상의 운영체제에서는 메모리 영역이 커지고, 메모리에 대한 관리 기법이 더 효과적으로 바뀌게 되어, 메가바이트 단위가 아니라면 이러한 일은 자주 발생 하지 않는다고 한다.) 이러한 현상을 방지하고자 할 때 쓰는 함수가 free다. free의 반환 타입도 void * 형이다.

new와 delete

new와 delete는 언어에서 기본으로 제공하는 키워드이기 때문에 별도의 헤더파일을 추가할 필요가 없다. new를 통해 동적할당을 해도 heap 영역에 할당한다. new의 경우 할당할 변수의 자료형을 지정하면 해당 자료형의 포인터를 반환하기 때문에 직접 사이즈를 입력하지 않아도 된다. 또한 클래스 객체를 동적 할당하게 되면 자동으로 생성자를 호출한다. 여기에 생성자는 목적에 맞게 오버로딩이 가능하다. delete의 경우 소멸자를 호출하여 메모리를 해제한다.

차이점

  • malloc은 해당 포인터의 자료형을 모르기 때문에 void* 로 리턴한다. 때문에 malloc 사용시 type casting 을 해주어야 한다.
    하지만 new의 경우 해당 객체에 맞는 포인터를 반환한다. 따라서 자료형을 따로 적어주지 않아도 된다.

  • new를 이용해 객체를 생성하면 생성자를 자동으로 호출하여 초기 값을 줄 수 있다. 하지만 malloc의 경우 생성자 호출 기능이 없어 초기값을 줄 수 없다.

  • free와 delete는 메모리를 해제하는 것은 동일하지만 delete는 소멸자를 호출한다.

  • malloc의 경우 realloc을 이용해 메모리 크기를 조정할 수 있다. 하지만 new는 할당된 크기에 대한 메모리 재조정이 불가능하다. 재조정하기 위해서는 새로 할당, 복사, 해제 하는 과정을 통해야 한다. 따라서 객체가 아니고, 재할당이 빈번하게 일어나야 한다면 malloc이 좋은 선택이 될 수 있다.

참조
https://hwan-shell.tistory.com/12
https://drunkenpsycho.tistory.com/13

profile
마이구미 마시쪙

0개의 댓글