메모리 동적 할당 그거 뭐 아무렇게나 하면 되지 않을까?
프로그래밍을 처음 배우게 되었을 때
가장 많은 의문점이 들었던 점은
메모리를 할당하여 사용하는데
정적 메모리와 동적 메모리가 있고,
동적 메모리를 할당하는 방법이 여러 가지가 있다는 점에서
의문점이 들었다.
C언어에서는 기본적으로 malloc이라는 함수를 사용하여 메모리를 할당하였다.
이후 C++ 언어에서는 new라고 하는 함수가 추가되어 메모리를 할당하였다.
(C++에서도 molloc을 호출하여 사용이 가능하다!)
그렇다면 이 두가지 동적 메모리 할당 방법의 차이점은 과연 무엇일까?
1. 메모리 할당과 해제 함수 호출 차이
우선 new로 할당된 동적 메모리는 delete로 메모리 해제를 해주어야 한다.
malloc으로 할당된 동적 메모리는 free로 메모리 해제를 해주어야 한다.
2. 메모리 할당/해제 시 생성자/소멸자 호출 차이
new로 메모리 할당 시 생성자를 호출해 주고, delete로 메모리 해제 시 소멸자를 호출해 준다.
(이런 기능으로 생성자/소멸자를 이용한 초기화가 가능하다.)
malloc과 free의 경우 생성자/소멸자를 호출해 주지 않는다.
3. 메모리 할당 시 리턴 값의 차이
new로 메모리 할당 시 할당된 자료형으로 리턴을 한다.
malloc은 메모리 할당 시 자료형을 지정해서 리턴을 해야만 한다.
new의 이런 기능은 type-safe라고 하며, 컴파일러가 할당된 메모리의 타입을 확인해 주는 기능으로 보면 된다.
예외 발생 시 리턴 값의 경우에도
new는 예외처리 구문을 작성할 수 있지만
malloc의 경우는 항상 nullptr이 리턴되어 예외처리를 할 수 없다.
4. 메모리 재할당 차이
new는 메모리 할당 후 크기를 조정하여 메모리를 할당할 수 없다.
하지만 malloc은 메모리 할당 후 realloc을 통해 크기를 재할당할 수 있다.
(하지만 C++에서 realloc이 제외된 이유는 명확히 있을 것이다. 실제로 이 기능이 유용하게는 쓸 수 있겠지만
메모리 관리 차원에서 그리고 SW 설계 관점에서는 좋지 않다고 판단된다.
goto도 같은 관점으로 지양해야 한다.)
지금까지 메모리 할당과 해제에 필요한
new(delete)와 malloc(free)의 차이에 대해서 설명해 보았다.
설계와 구현 방식에 따라 적절한 방법의 메모리 할당/해제를 사용하면 될 것이다.
끝.
'프로그래밍 > C++' 카테고리의 다른 글
[C/C++] MFC에서 콘솔 창(Console Window) 모드로 변경하여 디버깅하기 (0) | 2022.03.01 |
---|
댓글