1. 함수의 원형
malloc과 free 함수의 원형은 다음과 같다.
void *malloc(unsigned int size);
void free(void *p);
malloc 함수의 반환형은 (void *) 형이라서 용도에 맞는 포인터 형으로 형 변환 후 사용해야 한다. 컴파일러 마다 자동으로 되는 것도 있지만 호환성을 위해선 꼭 해야 하는 과정이다.
2. 반환값이 널 포인터인지 반드시 확인하기
메모리 할당 함수는 원하는 크기의 공간을 할당하지 못하면 0번지인 널 포인터를 반환하게 된다. 이는 보통 NULL로 표기하는데 stdlib.h에서 매크로 정의로 0이라 되어 있기 때문에 전처리 과정에서 0으로 바뀐다. 즉 정수 0과 같다고 생각해도 된다. 그러나 널 포인터는 포인터의 특별한 상태를 나타내기 위해 사용하므로 간접 참조 연산을 사용할 수 없다. 그래서 널 가드라고 불리는 if 조건문을 통해 malloc이 널 포인터를 반환할 경우 그 값을 참조하면 실행 중에 에러 메시지를 표시하고 비정상 종료를하면 된다.
3. 사용이 끝난 저장 공간은 재활용할 수 있도록 반환해야 한다.
자동 지역 변수의 저장 공간은 함수가 반환될 때 자동으로 회수되지만 동적으로 할당된 저장 공간은 함수가 반환된 후에도 그대로 메모리에 남아 있습니다. 따라서 함수가 반환되기 전에 동적 할당한 저장 공간은 free 함수로 직접 반환해야 합니다. 프로그램에서 동적으로 할당한 저장 공간은 해당 프로그램이 종료될 때 운영체제에 의해 자동으로 회수되어 다른 프로그램이 실행될 때 재활용이 되어서 main 함수가 끝날 때는 굳이 반환할 필요가 없다. 하지만 그 외 다른 함수에서 사용하던 저장 공간은 불필요한 경우 반환하여 새로운 동적 할당에 재활용할 수 있도록 해야 한다.
메모리를 반환하기 않으면 메모리 누수(memory leak)가 일어나는데 프로그램이 의도치 않게 종료될 수도 있습니다. 간단한 계산을 하고 금방 종료하는 프로그램은 티가 안 날 수 있지만 오랜 기간 내내 돌아가는 서버 같은 경우라면 사태가 심각해질 수 있습니다. 따라서 사용한 메모리는 반드시 해제하는 습관을 들여야 합니다.
'C언어' 카테고리의 다른 글
[혼공C] 15-1 2차원 배열의 요소를 참조하는 원리 (feat. 극혐 이중 포인터, 배열 포인터, 포인터 배열) (0) | 2021.10.12 |
---|---|
[혼공C] 목차 정리 (0) | 2021.10.11 |
[혼공C] 13-1 변수의 영역과 데이터 공유 (0) | 2021.10.09 |
[혼공C] string.h 헤더파일 내장 함수 구현(strlen, strncpy, strncat, strcpy) (0) | 2021.10.09 |
[혼공C] 12-2 대입 연산자를 사용한다면 배열 선언과 동시에 문자열 초기화는 국룰 (0) | 2021.10.08 |
1. 함수의 원형
malloc과 free 함수의 원형은 다음과 같다.
void *malloc(unsigned int size);
void free(void *p);
malloc 함수의 반환형은 (void *) 형이라서 용도에 맞는 포인터 형으로 형 변환 후 사용해야 한다. 컴파일러 마다 자동으로 되는 것도 있지만 호환성을 위해선 꼭 해야 하는 과정이다.
2. 반환값이 널 포인터인지 반드시 확인하기
메모리 할당 함수는 원하는 크기의 공간을 할당하지 못하면 0번지인 널 포인터를 반환하게 된다. 이는 보통 NULL로 표기하는데 stdlib.h에서 매크로 정의로 0이라 되어 있기 때문에 전처리 과정에서 0으로 바뀐다. 즉 정수 0과 같다고 생각해도 된다. 그러나 널 포인터는 포인터의 특별한 상태를 나타내기 위해 사용하므로 간접 참조 연산을 사용할 수 없다. 그래서 널 가드라고 불리는 if 조건문을 통해 malloc이 널 포인터를 반환할 경우 그 값을 참조하면 실행 중에 에러 메시지를 표시하고 비정상 종료를하면 된다.
3. 사용이 끝난 저장 공간은 재활용할 수 있도록 반환해야 한다.
자동 지역 변수의 저장 공간은 함수가 반환될 때 자동으로 회수되지만 동적으로 할당된 저장 공간은 함수가 반환된 후에도 그대로 메모리에 남아 있습니다. 따라서 함수가 반환되기 전에 동적 할당한 저장 공간은 free 함수로 직접 반환해야 합니다. 프로그램에서 동적으로 할당한 저장 공간은 해당 프로그램이 종료될 때 운영체제에 의해 자동으로 회수되어 다른 프로그램이 실행될 때 재활용이 되어서 main 함수가 끝날 때는 굳이 반환할 필요가 없다. 하지만 그 외 다른 함수에서 사용하던 저장 공간은 불필요한 경우 반환하여 새로운 동적 할당에 재활용할 수 있도록 해야 한다.
메모리를 반환하기 않으면 메모리 누수(memory leak)가 일어나는데 프로그램이 의도치 않게 종료될 수도 있습니다. 간단한 계산을 하고 금방 종료하는 프로그램은 티가 안 날 수 있지만 오랜 기간 내내 돌아가는 서버 같은 경우라면 사태가 심각해질 수 있습니다. 따라서 사용한 메모리는 반드시 해제하는 습관을 들여야 합니다.
'C언어' 카테고리의 다른 글
[혼공C] 15-1 2차원 배열의 요소를 참조하는 원리 (feat. 극혐 이중 포인터, 배열 포인터, 포인터 배열) (0) | 2021.10.12 |
---|---|
[혼공C] 목차 정리 (0) | 2021.10.11 |
[혼공C] 13-1 변수의 영역과 데이터 공유 (0) | 2021.10.09 |
[혼공C] string.h 헤더파일 내장 함수 구현(strlen, strncpy, strncat, strcpy) (0) | 2021.10.09 |
[혼공C] 12-2 대입 연산자를 사용한다면 배열 선언과 동시에 문자열 초기화는 국룰 (0) | 2021.10.08 |