C언어에서 변수의 메모리는 스택(stack) 또는 힙(heap)에 할당될 수 있습니다.
malloc, calloc, realloc을 통해 동적으로 메모리를 할당하며, free를 통해 수동으로 해제됩니다. 메모리 크기는 시스템의 가능성에 따라 제한되지만 접근 속도가 느리고 수동으로 해제를 관리해야 합니다.스택을 사용할 때:
힙을 사용할 때:
// 스택에 int arr[10]; // 힙에 int* parr = malloc(sizeof(int) * 10); // 메모리 해제를 잊지 마세요 free(parr);
질문: malloc으로 할당된 배열에 대해 free 함수를 호출하지 않으면 어떻게 되나요?
답변: 메모리 누수(memory leak)가 발생합니다. 동적으로 할당된 메모리는 자동으로 해제되지 않으며 시간이 지남에 따라 애플리케이션이나 전체 시스템의 메모리가 소진될 수 있습니다.
void leak() { int* leakArr = malloc(100 * sizeof(int)); // free(leakArr) 호출 없음, 메모리가 손실됨 }
이야기
어떤 프로젝트에서 프로그래머들은 세션 사용자 구조체의 메모리를 malloc을 통해 할당했지만, 세션 작업이 끝난 후 free를 호출하는 것을 잊었습니다. 그 결과 프로젝트는 며칠 동안 메모리를 잃어버렸고 서버는 메모리 부족 오류로 "중단"되었습니다. 이 문제는 Valgrind로 프로파일링하고 모든 누락된 free를 수정한 후에야 해결되었습니다.
이야기
한 개발자는 임시 계산을 위해 스택에 큰 배열(최대 10MB)을 할당했습니다. 작은 스택 크기를 가진 서버에서 이것은 스택 오버플로우 오류로 애플리케이션이 충돌하게 만들었습니다. 분석 후 버퍼를 힙으로 옮겨야 했습니다.
이야기
한 개발자는 긴 문자열을 스택에 저장하기로 결정했지만, 문자열 크기가 주관적으로 사용자에 의해 지정되었습니다. 매우 긴 문자열을 입력할 경우 애플리케이션이 메모리 접근 오류로 중단되었습니다. 결국 입력된 데이터를 길이 확인과 함께 힙으로 옮기기로 결정했습니다.