다른 함수에서 free - daleun hamsueseo free

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

다른 함수에서 free - daleun hamsueseo free

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

다른 함수에서 free - daleun hamsueseo free

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

다른 함수에서 free - daleun hamsueseo free

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

다른 함수에서 free - daleun hamsueseo free

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


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

다른 함수에서 free - daleun hamsueseo free

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

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

다른 함수에서 free - daleun hamsueseo free

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

다른 함수에서 free - daleun hamsueseo free

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


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

다른 함수에서 free - daleun hamsueseo free

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

다른 함수에서 free - daleun hamsueseo free

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

다른 함수에서 free - daleun hamsueseo free

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

다른 함수에서 free - daleun hamsueseo free

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

다른 함수에서 free - daleun hamsueseo free

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

다른 함수에서 free - daleun hamsueseo free

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