free()를 이용한 메모리 해제
Coddy C 여정의 Logic & Flow 섹션에 포함된 레슨 — 63개 중 35번째.
malloc()을 사용하여 동적으로 메모리를 할당하면, 해당 메모리는 명시적으로 해제할 때까지 할당된 상태로 유지됩니다. free() 함수는 사용을 마친 동적 할당 메모리를 시스템에 반환하기 위한 도구입니다.
free() 함수는 하나의 인자를 받습니다: 해제하려는 메모리 블록에 대한 포인터입니다. 이 포인터는 malloc() (또는 calloc()과 같은 관련 함수)에 의해 반환된 것과 동일한 포인터여야 합니다.
#include <stdlib.h>
int *ptr = (int*)malloc(sizeof(int)); // 메모리 할당
*ptr = 42; // 메모리 사용
free(ptr); // 작업 완료 후 메모리 해제free()를 호출하지 않으면 메모리 누수(memory leak)라고 알려진 현상이 발생합니다. 할당된 메모리는 더 이상 사용하지 않더라도 프로그램에 의해 예약된 상태로 남게 됩니다. 장시간 실행되는 프로그램이나 메모리를 반복적으로 할당하는 프로그램에서 이러한 누수는 사용 가능한 모든 시스템 메모리를 소모하여 성능 문제나 충돌을 일으킬 수 있습니다.
기억하세요: 모든 malloc()은 그에 대응하는 free()를 가져야 합니다. 이러한 쌍을 맞추는 것은 C 프로그래밍에서 책임감 있는 메모리 관리를 위해 필수적입니다.
챌린지
쉬움동적 메모리 할당 및 해제의 전체 수명 주기를 보여주는 C 프로그램을 작성하세요. 프로그램은 다음을 수행해야 합니다:
- 사용자로부터 저장할 정수의 개수를 나타내는 정수
count를 읽습니다. sizeof()와 함께malloc()을 사용하여count개의 정수를 저장할 배열을 위한 메모리를 동적으로 할당합니다.- 메모리 할당이 성공했는지 확인합니다. 실패하면
Memory allocation failed!를 출력하고 프로그램을 종료합니다. - 할당에 성공하면
Memory allocated successfully!를 출력합니다. - 사용자로부터
count개의 정수 값을 읽어 할당된 배열에 저장합니다. - 모든 값의 합계를
Sum: [value]형식으로 계산하고 출력합니다. - 최댓값을 찾아
Maximum: [value]형식으로 출력합니다. free()를 사용하여 메모리 할당을 해제합니다.- 정리가 완료되었음을 확인하기 위해
Memory freed successfully!를 출력합니다.
malloc()과 free()를 사용하려면 <stdlib.h> 헤더를 포함해야 함을 기억하세요. 이 챌린지는 프로그램에서 메모리 누수를 방지하기 위해 malloc()과 free()를 필수적으로 짝지어 사용하는 방법을 보여줍니다.
예를 들어, 입력이 다음과 같다면:
4
15 8 23 12출력은 다음과 같아야 합니다:
Memory allocated successfully!
Sum: 58
Maximum: 23
Memory freed successfully!이 챌린지는 동적으로 할당된 모든 메모리 블록이 더 이상 필요하지 않을 때 적절하게 해제되어야 한다는 중요한 개념을 강화하며, C 프로그래밍에서 책임감 있는 메모리 관리 주기를 완성합니다.
치트 시트
malloc()으로 할당된 메모리를 해제하려면 free()를 사용하세요:
#include <stdlib.h>
int *ptr = (int*)malloc(sizeof(int)); // 메모리 할당
*ptr = 42; // 메모리 사용
free(ptr); // 작업 완료 후 메모리 해제메모리 누수를 방지하기 위해 모든 malloc()은 그에 대응하는 free()를 가져야 합니다. free()에 전달되는 포인터는 malloc()에 의해 반환된 포인터와 동일해야 합니다.
직접 해보기
#include <stdio.h>
#include <stdlib.h>
int main() {
int count;
// 저장할 정수의 개수를 읽습니다
scanf("%d", &count);
// TODO: 아래에 코드를 작성하세요
// 1. sizeof()와 malloc()을 사용하여 메모리를 할당하세요
// 2. 할당이 성공했는지 확인하세요
// 3. 정수 값들을 읽어서 저장하세요
// 4. 합계를 계산하고 최댓값을 찾으세요
// 5. 할당된 메모리를 해제하세요
return 0;
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.