C/C++ 표준 라이브러리 함수 void free(void *ptr)는 이전에 malloc, calloc, realloc 호출을 통해 동적으로 할당된 메모리를 해제하는 역할을 합니다. 동적 메모리를 더 이상 사용하지 않게 되면 반드시 이 함수를 호출하여 메모리 누수(memory leak)를 방지해야 합니다.
free() 함수 선언
void free(void *ptr)
이 함수는 포인터 ptr을 매개변수로 받습니다. ptr은 malloc, calloc 또는 realloc으로 이전에 할당된 메모리 블록을 가리키는 포인터이며, 해당 메모리가 시스템에 반환됩니다. 만약 인자로 널(NULL) 포인터가 전달되면 아무 작업도 수행하지 않으므로 안전합니다.
사용 예제
다음 예제는 malloc으로 메모리를 할당하고, realloc으로 크기를 늘린 뒤, 마지막에 free로 메모리를 해제하는 과정을 보여줍니다.
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
int main () {
char *str;
/* 초기 메모리 할당 */
str = (char *) malloc(15);
strcpy(str, "tutorialspoint");
cout << "String = "<< str <<", Address = "<< &str << endl;
/* 메모리 재할당 */
str = (char *) realloc(str, 25);
strcat(str, ".com");
cout << "String = "<< str <<", Address = "<< &str << endl;
/* 할당된 메모리 해제 */
free(str);
return(0);
}실행 결과
String = tutorialspoint, Address = 0x22fe38 String = tutorialspoint.com, Address = 0x22fe38
주의 사항
- 이미 해제된 메모리에 대해 free()를 다시 호출하면 정의되지 않은 동작(undefined behavior)이 발생할 수 있습니다.
- free() 호출 후에는 해당 포인터를 널 포인터로 설정(
str = NULL;)하면 실수로 재사용하거나 이중 해제하는 것을 예방할 수 있습니다. - 순수 C++ 코드에서는 malloc/free보다 new/delete 연산자, 그리고 스마트 포인터(std::unique_ptr, std::shared_ptr)를 사용하는 것이 더 안전하고 권장되는 방식입니다.