코딩하는 오징어

C++에서의 동적할당과 해제(new & delete) 본문

Language/C++

C++에서의 동적할당과 해제(new & delete)

코딩하는 오징어 2017. 10. 6. 13:45
반응형

안녕하세요. 코딩하는 오징어입니다. 긴 연휴들 잘 보내시고 계신가요?? 저는 하루종일 과제만하다 머리도 식힐겸 포스팅을 하게 됐네요.ㅠㅠ 과제를 하다 C로 명령어들을 파싱하고 쓰레드를 돌리는 부분이 있었는데 꽤 괜찮아 보여서 이 부분은 linux나 os 공간에 포스팅을 하겠습니다. 관심이 있으신 분들은 와서 구경 한번 하고 가세요~


오늘은 C 에서 사용하는 malloc()과 free(), C++에서 사용하는 new, delete를 비교해보겠습니다.

먼저, malloc()함수와 free()함수 그리고 new, delete연산자는 런타임 도중에 공간을 새로 할당받아서 동적으로 메모리를 관리 하는 것입니다. 메모리상에는 heap공간을 사용하게 됩니다. 위에 말씀드린 것과 같이 malloc과 free는 함수이지만 new와 delete는 연산자입니다. 따라서 new와 delete는 연산자 오버로딩이 가능합니다. 이 부분은 추후에 다시 포스팅 하겠습니다.


void * malloc(size_t size)


malloc함수의 인터페이스입니다. malloc함수는 void *를 반환하기 때문에 꼭 캐스팅을 한 후 사용하셔야 합니다.


new 타입


new연산자를 사용하는 방법입니다. new를 쓴 후 type을 적어주시면 그 타입에 맞게 공간을 할당해줍니다. C++에서는  new연산자를 통해 동적으로 공간을 할당받는 것을 권장합니다. 그 이유는 바로 C++에만 있는 클래스 때문인데요, 클래스를 통해 객체를 생성할 때 자동으로 생성자를 호출하게 되는데 malloc으로 공간을 할당받게 되면 클래스 크기만큼만 공간을 할당할 뿐 생성자를 호출해주지 않습니다. 반면, new 로 클래스 객체를 생성하게되면 생성자를 호출해줍니다. 한 끗 차이지만 굉장히 큰 차이라고 말씀드리고 싶습니다.

delete와 free()의 차이점도 같다고 볼 수 있습니다. 객체를 소멸시킬 때 소멸자를 호출하여야하는데 free()함수는 공간만 해제 시킬 뿐 소멸자를 호출하지않습니다. 따라서 delete를 사용하여 동적으로 잡은 공간을 해제해 주시기를 권장합니다.


다음은 예제 소스코드입니다.



보시는 코드와 같이 사용하시면 되는데 여기서 응용을 한번 해봅시다. 이차원 배열은 어떻게 할당 받으면 될까요?




이차원 배열을 할당 하실 때는 위 그림과 같이 먼저 기둥을 세우고 거기에 붙이는 방식으로 하셔야합니다. 해제할 때는 역순으로 하면 되겠죠?? 그럼 소스코드를 보겠습니다.



맨 첫 줄을 보시면 int **arr = new int *[5]; 가 있습니다. 그림과 같이 먼저 일차원 배열들을 담을 기둥을 만들었습니다. 이렇게 하면 이차원 가변배열도 만들 수 있겠죠?? 이것은 스스로 한번 해봅시다.

그 다음에 코드를 보시면 기둥에 배열들을 때려 박습니다. 이렇게 되면 이차원 배열을 만들어 사용할 수 있게됩니다. 결과값과 같이 보시면 이해가 빠를 것입니다. 

 마지막으로 delete하는 부분을 봅시다. new로 할당 받은 것과 반대로 메모리를 해제 하는 것을 확인 할 수 있습니다. 3차원 배열도 쉽게 만들수 있겠죠? 실제로 3차원 까지 쓸일은 별로.. 3D프로그래밍 분야에서 사용되거나 그마저도 빠르게 진행하기위해 일차원배열로 처리하는 경우가 많습니다. 다만 이렇게 할 수도 있다로 알아두시면 좋을 것 같습니다.

이상 코딩하는 오징어 였습니다.

반응형

'Language > C++' 카테고리의 다른 글

C++의 클래스 생성자 & 소멸자  (1) 2017.10.09
함수 오버로딩(function overloading)과 매개변수의 디폴트 값  (0) 2017.09.26
참조자(reference)  (0) 2017.09.25
네임스페이스(namespace)  (1) 2017.09.25
visual studio DEBUG  (0) 2017.09.17
Comments