C언어

[C언어] 메모리 누수(Memory Leak)란?

_minit 2024. 10. 29. 08:38

메모리 누수란 프로그램이 실행되는 동안 동적으로 할당된 메모리(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