free()를 이용한 메모리 해제
Coddy C 여정의 논리 & 흐름 섹션에 포함된 레슨. 63개 중 35번째.
when malloc()을 사용하여 memory를 동적으로 할당하면, 해당 memory는 명시적으로 해제할 때까지 allocated 상태로 유지됩니다. 사용이 끝났을 때 동적으로 allocated된 memory를 시스템에 반환하는 도구가 free() 함수입니다.
free() 함수는 하나의 인수를 받습니다. 바로 할당 해제하려는 메모리 블록을 가리키는 포인터입니다. 이 포인터는 malloc()(또는 calloc()과 같은 관련 함수)이 반환한 것과 동일한 포인터여야 합니다.
#include <stdlib.h>
int *ptr = (int*)malloc(sizeof(int)); // 메모리 할당
*ptr = 42; // 메모리 사용
free(ptr); // 작업이 끝나면 메모리 해제free()를 호출하지 않으면 memory 누수라고 하는 문제가 발생합니다. 할당된 memory는 더 이상 사용하지 않더라도 프로그램에 의해 계속 예약된 상태로 남아 있습니다. 장시간 실행되는 프로그램이나 memory를 반복적으로 할당하는 프로그램에서는 이러한 누수로 인해 사용 가능한 system memory가 모두 소모되고 성능 문제가 발생하거나 충돌할 수 있습니다.
기억하세요: 모든 malloc()에는 이에 대응하는 free()가 있어야 합니다. 이러한 짝은 C 프로그래밍에서 책임감 있는 memory 관리에 필수적입니다.
챌린지
쉬움동적 memory allocation 및 deallocation의 전체 lifecycle을 보여 주는 C 프로그램을 작성하세요. 프로그램은 다음을 수행해야 합니다:
- 저장할 integers의 개수를 나타내는 integer
count를 사용자로부터 Read합니다 malloc()을sizeof()와 함께 using하여countintegers의 배열에 사용할 memory를 동적으로 Allocate합니다- memory allocation이 successful했는지 Check합니다. 실패하면
Memory allocation failed!를 출력하고 프로그램을 종료합니다 - allocation이 성공하면
Memory allocated successfully!를 출력합니다 - 사용자로부터
count개의 integer values를 Read하여 allocated 배열에 store합니다 - 모든 values의 sum을 다음 형식으로 Calculate하고 출력합니다:
Sum: [value] - maximum value를 찾아 다음 형식으로 출력합니다:
Maximum: [value] free()를 using하여 memory를 deallocate합니다- cleanup을 확인하기 위해
Memory freed successfully!를 출력합니다
malloc()과 free()를 사용하려면 <stdlib.h> header를 include해야 합니다. 이 challenge는 프로그램에서 memory leaks를 prevent하기 위한 malloc()과 free()의 essential pairing을 보여 줍니다.
예를 들어 input이 다음과 같다면:
4
15 8 23 12output은 다음과 같아야 합니다:
Memory allocated successfully!
Sum: 58
Maximum: 23
Memory freed successfully!이 challenge는 더 이상 필요하지 않을 때 dynamically allocated된 모든 memory block을 적절히 free해야 한다는 critical concept를 강화하여, C programming에서 responsible memory management cycle을 완성합니다.
직접 해보기
#include <stdio.h>
#include <stdlib.h>
int main() {
int count;
// 저장할 정수의 개수를 읽습니다
scanf("%d", &count);
// TODO: 아래에 코드를 작성하세요
// 1. malloc()과 sizeof()를 사용하여 메모리를 할당합니다
// 2. 할당이 성공했는지 확인합니다
// 3. 정수 값을 읽어 저장합니다
// 4. 합계를 계산하고 최댓값을 찾습니다
// 5. 할당된 메모리를 해제합니다
return 0;
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
논리 & 흐름의 모든 레슨
직접 연습해 보세요: 온라인 C 컴파일러