크리에이티브 커먼즈 라이선스
Creative Commons License
이 내용은 저번에 포스팅 하려고 했습니다만... 제가 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++표준 헤더를 사용합니다. 



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


저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

오늘 제가 배운 내용은 동적 메모리입니다.

C++에서 새로운 키워드은 new&delete를 공부하려고 보니 C언어의 malloc&free가 기억이 안나서

다시 공부했습니다..


프로그램이 메모리를 할당 받는 방식은 두 가지의 방법이 있습니다.

우선 우리가 C언어를 계속 공부하면서 자연스럽게 사용하던 정적 할당입니다.  예로 int나 double을 사용하면 4바이트 또는 8바이트를 할당 받는다는 것을

여러분은 알고 계실껍니다. 그렇다면 이러한 정적 할당이 뭐가 문제여서 동적 할당이 등장했냐고 물어보시면

정적 할당의 단점은 프로그램 실행 전에 먼저 정해진 메모리를 할당 받는게 문제입니다. 작은 메모리라면 별 신경 안쓰셔도 되겠지만

프로그램이 커지면 커질 수록 낭비되는 메모리도 많을 것이고 초과하는 메모리도 있을껍니다. 그래서 이러한 문제점을 극복하려 등장한게 

동적 할당 입니다.~


동적 할당은 프로그램 실행 중 필요한 만큼의 메모리를 할당하는 방법으로 사용 후에는 다시 반납하는 방식입니다.

또한 동적 할당은 정적 할당처럼 사용할 수 있다는 특징이 있습니다. 이러한 특징들을 봤을 때 동적 할당은 효율적이다는 생각이 드실껍니다.

그렇다면 어떻게 사용되는지 배워보겠습니다.


우선 함수 키워드는 malloc과 free가 있습니다.

void *malloc(size_t size);  = 반환형 void는 사용자가 알맞게 원하는 타입으로 바꿔주셔야 합니다. 또한 옆의 괄호 안에는 사이즈가 들어가게 됩니다.

ex) int *p,    p = (int *)malloc(500) // 500바이트 할당입니다.

그런데 이러한 모습은 우리가 봐오던 malloc과는 좀 거리가 있습니다.

바이트를 할당하기보다는 알맞는 타입의 갯수로 할당을 받는게 일반적이며 주로 사용할 때는 배열로 쓰는게 일반적입니다.

ex) int *score , score = (int *)malloc(100*sizeof(int)); 이러면 정수형*100개가 되는 겁니다.

int 뿐만이 아니라 구조체도 넣을 수 있습니다. 또한 사용할 때 항상 반환값이 NULL 값인지 확인해야 합니다. 메모리가 부족하면

NULL값을 반환하기 때문에 올바르게 할당되었는지의 확인 절차가 필요합니다.


할당을 해봤으니 이제 반납을 하겠습니다.

반납을 하면 그 함수는 다시 쓸 수 없으며 반드시 반환 포인터로 반환 해야합니다.

즉 p = (int *)malloc(500); 이면 free(p);로 반납해야 합니다.


뿐만 아니라 동적 할당에는 malloc함수만 있는게 아닙니다. 그외로

calloc()함수나 realloc()함수가 존재합니다. 동적 할당 함수들은 stdlib.h에 있으니 직접 확인하시는 것도 나쁘지 않습니다.

아주 간단하게 동적 할당과 malloc&free함수에 대해서 공부했습니다.


오류나 틀린점이 있다면 댓글로 남겨주시면 감사하겠습니다.

저작자 표시 비영리 변경 금지
신고

+ Recent posts

티스토리 툴바