Nagie's DevStory
[CPP] 07. 달라진 메모리 동적 할당 본문
C 나 C++을 사용하는 이유 중 하나는 아마 포인터를 사용하기 위함이라고 해도 과언이 아닐듯하다.
다만 포인터라는 건 장미꽃의 가시와도 같으며 잘 사용한다면 강력하고 아름답지만.
사용법이 미숙하다면 조그마한 실수에도 치명적인 오류를 일으킨다.
그와 더불어 '포인터'라는 말은 늘 '메모리 관리'라는 말을 수식어처럼 달고 다니는데
이는 무엇보다 할당과 해제라는 관리 문제가 있기 때문이다.
그리고 새로운 방법을 보기 전 우린 C에서 사용했던 malloc()과 free()를 되짚어 볼 필요가 있다.
int* dynamicArray = (int*)malloc(10 * sizeof(int));
free(dynamicArray);
dynamicArray = NULL;
지금 보니 어떻게 이런 걸 사용했을까 싶을 정도로 끔찍하다.
하지만 이제부턴 malloc()과 free()는 잊어버리는 게 좋을지도 모르겠다.
아니 그냥 작별하는 편이 나을수도 있을거같다.
malloc()과 free()는 객체지향 프로그래밍을 방해하는 요인으로 작용할 수 있기 때문이다.
대신 지금부턴 new와 delete 연산자를 활용해야 한다.
new와 delete 연산자는 내부에서 malloc()과 free()를 호출하긴 하지만
malloc()과 free()보다 담당하는 기능이 더 많다.
거기다 문법적으로 new와 delete는 '연산자'이며
malloc()과 new()처럼 복잡한 함수를 사용한다는 느낌이 줄어 편의성이 좋아졌다.
다음은 new와 delete의 사용법이다.
//일반적인 사용
int* pPtr = new int;
delete pPtr;
//배열형식 사용
int* pPtr = new int[10];
delete[] pPtr;
new를 malloc()과 비교했을 때 도드라진 특징 중 하나는 메모리 크기를 사용자가 직접 정하지 않는다는 점이며
덤으로 void*로 반환되는 특징 때문에 사용 시
malloc()앞에 못생긴 타입 캐스팅 연산자를 붙여야 한다는 문제점도 해결됐다.
다만 new 연산자를 통해 동적 메모리를 배열 형태로 할당받았다면 무조건 delete[] 연산자로 해제해 줘야 한다.
그리고 malloc()과 free()와는 다르게 new와 delete는 객체의 생성자와 소멸자를 호출한다는 사실도 기억하면 좋다.