c언어 free 함수 : 쌍이 맞아야 된다.

코딩/C 2019. 12. 3. 23:41

 동적 할당은 무엇인가요? 예를 들어, 이런 코드가 있다고 해 봅시다.

 

 malloc 함수가 호출되기 전에 메모리 상태는 아래와 같습니다.

 

 

 처음에 Heap 영역에는 아무 것도 할당되지 않았습니다. 그런데 malloc, 메모리 할당 함수가 호출이 되면, 힙 영역에 무언가를 위한 공간이 만들어 집니다.

 

 

 그러면 이런 상태가 됩니다. 메모리에 할당된 주솟값을 p가 받고 있습니다.

 

 

 그러면 stack에 있는 변수 p가 Heap 공간에 할당된 space를 가리킵니다. 이것이, 자동으로 해제가 되면 좋겠습니다만. 그렇지 않아요. 명시적으로 해제를 시켜주지 않으면, (동적으로 할당된 공간은) 프로그램이 끝날 때 까지 메모리에서 사라지지 않습니다.

 

 


 free 함수의 원형은 다음과 같습니다.

 

 

 그냥 해제할 공간의 주소만 넘겨주면 됩니다. 그런데 주의해야 할 것이라고 하면, 짝을 잘 맞춰야 한다는 것입니다. 예를 들자면, free 함수는 malloc이나 calloc으로 할당한 메모리의 주소를 free 시킬 수 있습니다. realloc도 있는데요. 그건 직접 해 보세요. new로 할당한 것은 안 됩니다. 그것은 delete 연산자로 해제시켜줘야 합니다.

 

 자. 이제 제가 할당한 공간을 해제해 주겠습니다. 그럴려면, free(p); 를 넣어주면 될 거에요.

 

 

 그런데, 그럼에도 불구하고, p는 free된 공간을 가리키고 있어요. 분명한 것은 해제된 공간에 다시 접근할 수 있어요. 허상 포인터라고 이야기를 하는데요. p = NULL;을 넣어주면 어떤가요?

 

 

 그러면, p는 해제된 공간을 가리키지 않습니다. 그러한 공간에 접근할 수 있는 방법은 없습니다.

 

 


 그러면 이 프로그램이 왜 런타임 에러가 나는지 보도록 합시다.

 

 

 복잡한 거 같지만, 사실 별 거 없어 보이네요. 일단 main 함수의 ptr은 리터럴 "abcd"를 가리키고 있어요.

 

 

 그러면 이런 상황이에요. 다음에 make_m... 함수가 호출이 될 텐데요. 이 때, ptr의 값을 넘깁니다. 값 복사가 되었기 때문에, make_memory의 매개변수 ptr은 main 함수의 ptr과 별개의 공간에 있습니다.

 

 

 물론 같은 공간을 가리키기는 할 겁니다.

 

 

 다음에 13번째 줄이 수행되면, malloc 함수에 의해서, ptr은 새로 heap에 할당된 공간인 노란색을 가리킵니다.

 

 

 그런데 함수가 끝나면, make_... 함수의 매개변수 ptr은 사라집니다. 그러면 이 때 main은 리터럴 "abcd"을 가리킬 겁니다.

 

 

 9번째 줄에서 그 공간을 free 한다고 합니다. malloc, calloc 계열 함수로, 동적으로 할당된 공간인가요? 짝이 맞나요? 아닙니다. 따라서, segmentation fault가 뜹니다.