[C] 메모리 누수(Memory Leak)

메모리 누수 정의

메모리 누수는 할당된 메모리가 더는 사용되지 않지만, 해제되지 않을 때 발생한다. 이를 테면 다음과 같은 상황에서 발생한다.

  • 메모리의 주소를 잃어버린 경우
  • free 함수가 호출되어야 하는 상황에 호출되지 않은 경우

메모리 누수의 예

  • 메모리 누수가 누적되면 힙 관리자가 사용할 수 있는 메모리 양이 감소하게 된다.
  • 메모리 누수가 반복되면, 추가적인 메모리가 필요할 때 malloc 함수가 OOM(Out of Memory) 오류를 발생시키며 추가적인 메모리를 할당하지 못해 프로그램이 종료된다.

아래의 코드는 메모리 누수를 발생시키는 코드의 예이다. 변수 chunk는 힙으로 부터 메모리를 할당받지만, 다른 메모리가 할당 되기전에 해제되지 않는다. 이 코드는 결국 OOM 오류를 발생시키고 비정상 종료된다.

메모리 주소 손실

  • pi 포인터는 해제되지 않은 상태에서 새로운 메모리 주소가 재할당된다.
  • pi 변수에 두 번째 메모리 주소가 할당될 때, 첫 번째 메모리의 주소는 손실된다.

아래의 그림에서 메모리 주소 Ox0E는 여전히 해제되지 않은 상태이며 프로그램 어디에서도 이 주소를 알지 못한다.

메모리 주소 손실

 
  • 아래의 예제 코드는 name 변수를 루프의 반복마다 1씩 증가시킨다.
  • 루프의 마지막에 name 변수는 문자열의 NUL 종료 문자를 가리킨다. ⇒ 할당된 메모리의 시작 주소를 잃어버림.

동적으로 할당된 메모리 주소 손실

 

숨겨진 메모리 누수

숨겨진 메모리 누수는 보통 프로그래머의 부주의에 때문에 발생한다.

  • 대표적인 예로는 struct 키워드를 사용하여 생성한 구조체를 내부에 멤버 변수로 포인터 변수가 존재하는 경우이다.
  • 만약 구조체 내부에 동적으로 생성된 메모리의 포인터를 포함하고 있다면, 이 포인터는 구조체를 해제하기 전에 반드시 해제되어야 한다.
이 글은 카테고리: C, Programming에 포함되어 있습니다. 고유주소를 북마크하세요.

댓글 남기기