| [ CnUnix ] in KIDS 글 쓴 이(By): guest (asegseg) <dor206103.kaist.> 날 짜 (Date): 2002년 12월 18일 수요일 오후 10시 18분 54초 제 목(Title): Re: 포인터질문하나더 C++에는 new operator와 delete operator가 있습니다. 둘다 사용자가 직접 정의할 수도 있습니다. 하지만 그렇지 않을 경우에는(built-in operator) 그 둘은 각각 malloc과 free를 사용하여 메모리를 할당합니다. new operator는 단순히 객체크기만큼만 malloc으로 할당을 할 것이고 new[] operator는 객체크기*사이즈 만큼 malloc으로 할당하게 됩니다. 물론 이때 메모리를 할당한 다음에 new operator는 그 해당객체의 constructor를 부르게 될 것이고(실제 코드에서 부르는 것이 아니라 compiler가 처리하는 부분), new operator[]는 사이즈 개수만큼 각각의 객체에 대해 constructor를 부르게 됩니다. 자 그럼 malloc은 어떻게 동작하냐면, 일단 malloc은 일반적으로 library함수입니다(즉, malloc이란 systemcall이 없다는 거죠) malloc(size);하고 불리게 되면, 먼저 malloc이 관리하는 메모리 구조(implementation마다 다르겠죠)를 뒤져서, size만큼을 현재 할당할 수 있다면 할당해 줍니다. 이때 일반적인 implementation은 할당하는 메모리주소 바로 앞부분에, 이 공간의 크기를 함께 기록해 놓습니다. 즉 char *p=malloc(size); 라면, p주소의 바로 앞부분(예를 들면 p[-4])에 공간의 크기가 기록되어 있는 것이죠.. 이제 free(p)를 부르게 되면, p주소의 바로 앞부분에 있는 공간크기를 참조하여, 올바르게 해제할 수 있는 것이죠.. delete operator와 delete[] operator는 각 객체의 destructor를 부른다음(compiler가 자동으로 처리하는 부분), free(할당된 주소)로 call하게 됩니다. new나 new[]가 malloc으로 할당을 하니 해제도 단순히 free로 하면 되는 겁니다. |