메모리 누수란 프로그램이 실행되는 동안 동적으로 할당된 메모리(malloc(), calloc(), realloc() 등)를 사용한 후 필요가 없어졌음에도 불구하고 해제하지 않은 경우에 발생한다.
메모리 누수 발생 원인
1. malloc()이나 calloc() 같은 함수로 메모리를 할당하고 사용 후 해제(free())하지 않은 경우 메모리 누수가 발생한다.
int *arr = (int *)malloc(100 * sizeof(int));
// free() 호출이 없어 누수 발생
2. 동적 메모리 할당 후, 해당 메모리를 가리키던 포인터를 덮어쓰거나 변경하면 원래의 메모리 주소에 접근할 수 없게 된다.
int *ptr = (int *)malloc(10 * sizeof(int));
ptr = NULL; // 할당된 메모리의 주소를 잃어버림 -> 누수 발생
3. 루프 안에서 메모리를 계속 동적으로 할당 후 해제하지 않으면 누수가 누적된다.
for (int i = 0; i < 1000; ++i) {
int *data = (int *)malloc(10 * sizeof(int));
// 할당 후 free(data) 호출이 없다면 메모리 누수가 누적됨
}
4. 링크드 리스트, 트리, 그래프와 같은 동적 자료 구조를 사용할 때 모든 노드를 명시적으로 해제하지 않으면 누수가 발생한다.
메모리 누수 방지 방법
1. 동적 메모리 해제 습관화
int *arr = (int *)malloc(100 * sizeof(int));
free(arr)
메모리를 할당할 때마다 반드시 해제하는 습관을 들인다.
2. 포인터 초기화
int *ptr = (int *)malloc(10 * sizeof(int));
free(ptr);
ptr = NULL;
메모리 누수의 영향
1. 시스템 메모리를 점진적으로 감소시킨다. 이것이 누적되면 결국 프로그램이나 시스템 전체에서 사용 가능한 메모리가 부족해진다.
2. 사용 가능한 메모리를 줄이기 때문에, 더 많은 오버헤드가 발생한다.
3. 비정상적으로 종료되거나 충돌할 수 있다.
728x90
'C언어' 카테고리의 다른 글
[C언어] NULL과 null (7) | 2024.11.04 |
---|---|
[C언어] Call by Value, Call by Reference란? (0) | 2024.11.04 |
[C언어] 래퍼 함수(Wrapper Function)란? (1) | 2024.10.28 |
[C언어] extern란? (0) | 2024.10.28 |
[C언어] 세미콜론(;)을 사용하는 이유 (0) | 2024.10.23 |