2015. 2. 2.

[C++]malloc을 사용한 동적 할당, new를 사용한 동적 할당

C에서의 동적 할당

 C에서 heap 영역에 동적 할당하려면 malloc(), realloc()과 같은 함수를 사용한다. malloc() 함수의 사용 예시를 먼저 살펴보자.

 malloc() 함수의 반환형은 void 포인터이다. 그러므로 원하는 자료형으로 적절하게 변환을 해주어야 한다. 위에서는 char 포인터로 형변환해주었다. 참고로 위의 코드에서처럼 C 스타일의 형 변환(type casting)은 안전하지 않을 수도 있으니 주의를 기울여야 한다. 그리고 C++의 type casting에 비해 가독성도 떨어진다. 이에 대해서는 나중에 포스팅하도록 하겠다. malloc 함수의 인자는 바이트 단위의 크기를 나타낸다. 어떤 크기를 동적 할당할지 인자로 정할 수 있다.
 동적 할당한 메모리를 반환하려면 free() 함수를 사용하면 된다. malloc을 통해 반환받은 포인터를 free() 함수의 인자로 전달하면 된다.


C++에서의 동적 할당

 C++은 C를 포함하는 개념이라고 전에 언급한 적이 있다. 그래서 C++에서는 malloc(), realloc(), free()를 C와 동일하게 사용할 수 있다. 하지만 새롭게 추가된 동적 할당 방법도 존재한다. 그것이 바로 new를 통한 동적 할당이다.
 위의 코드는 new를 통한 동적 할당과 delete를 통한 메모리 해제의 예시를 보여준다. 배열의 형태로 동적 할당했으므로 delete할 때 '[]'를 빠트려서는 안 된다.

 지금까지의 내용으로 malloc() 함수와 new는 크게 달라보이지 않는다. 하지만 malloc() 함수와 new는 큰 차이가 있다. 다음은 클래스를 malloc() 함수를 통해서 동적 할당한 경우와 new 함수를 통해서 동적 할당한 경우를 동시에 보여준다. 이 예를 통해 malloc() 함수를 통한 동적 할당과 new를 통한 동적 할당의 가장 큰 차이를 확인할 수 있을 것이다.
 case1은 new를 통해 동적 할당하였다. 실행 결과 case1에는 생성자(constructor)가 실행된다. 그리고 delete를 통해 메모리를 해제하면 소멸자(destructor)가 실행된다. case2는 malloc() 함수를 통한 동적 할당이다. 실행결과에서도 확인할 수 있지만 new와는 달리 생성자가 호출되지 않는다. free() 함수를 통한 메모리 해제도 소멸자가 호출되지 않는다. 이처럼 malloc(), free()를 통한 동적 할당과 해제, new, delete를 통한 동적 할당과 해제는 생성자와 소멸자를 호출하는지 하지 않는지의 차이가 있다.

댓글 없음:

댓글 쓰기