알음알음-IT/개발_기초_코딩_C++

C++ 공부하기 - 7.new&delete

구구닥스 2020. 2. 4. 14:28

이 내용은 저번에 포스팅 하려고 했습니다만... 제가 malloc&free의 개념이 모호해져서 다시 공부하고 오느라

 

조금 늦었습니다. 우선 C언어에서의 malloc&free는 동적할당을 함으로 정적할당보다 더 효율적으로 메모리를 사용할 수 있었습니다.

 

이 개념이 C++에서도 똑같이 적용되어 넘어왔으나 malloc&free의 단점인

 

  • 할당 대상의 정보를 무조건 바이트로 받는다는 점

  • 반환형이 void이기 때문에 적절한 형변환을 거쳐야한다는 점

이 두가지의 단점을 가지지 않은 다른 함수로 대체하여 나온 함수입니다. 이 함수가 바로 new&free 입니다. 

 

그러면 저 두가지의 단점을 극복했다면 어떻게 극복했고 뭐가 더 좋기 때문에 C++에서 쓰이는지 알아보겠습니다.

우선 malloc을 대체한 키워드 new는 

int형 변수의 할당    int * ptr1 = new int;

double형 변수의 할당    double * ptr2 = new double;

길이가 4인 int형 배열의 할당 int * arr1 = new int[4];

 

위와 같이 사용합니다. malloc은 (int*)malloc(sizeof(int)*4 처럼 길게 써야하는 대신 new는 훨씬 간결합니다.

 

free를 대체한 키워드 delete는 free와 비슷합니다.

int형 변수의 소멸 delete ptr1;

double형 변수의 소멸 delete ptr2;

길이가 4인 int형 배열의 할당 delete []arr1;

 

위와 같이 사용하나 배열일 때만 []를 사용하여 배열임을 알려주기만 하면 됩니다.

 

C++에서 C언어 함수를 사용할 수 있지만 위와 같이 명백한 대체 함수가 있을 때는 대체함수를 사용하는 것이 좋습니다.

특히 malloc&free는 C++에서는 에러를 발생시킬 수 있기 때문에 유의 하셔야 됩니다.

new&delete와 malloc&free는 사용처는 같지만 전혀 다른 구동방식을 가졌기 때문입니다. 

간단한 예로 new는 할당 받은 공간도 참조할수 있습니다. 포인터를 사용하지 않아도 된다는 점이 특히하지요

 

말한김에 C++에서도 C언어의 표준 함수를 사용할 수 있습니다.

stdio.h는 cstdio로

stdlib.h는 cstdlib로

math.h는 cmath로 

string.h는 cstring으로  바꿔서 사용하시면 됩니다.

헤더에서 앞에 c가 붙고 뒤에 .h가 빠졌다는 것만 알아두시면 됩니다. 

위에서 말씀드렸지만 C++에서 C언어 함수가 구동되지만(하위 버전과의 호환성을 위해),  오류가 발생할 가능성이 높기 때문에 C++에서는 C++함수를

사용하시는게 맞는겁니다.

 

C++은 C++표준 헤더를 사용합니다. 

 

 

제가 직접 공부하고 쓰기 때문에 미숙하고 오류가 있을 수 있습니다. 그러니 항상 댓글로 알려주시면 감사하겠습니다.