메모리 누수 정의
메모리 누수는 할당된 메모리가 더는 사용되지 않지만, 해제되지 않을 때 발생한다. 이를 테면 다음과 같은 상황에서 발생한다.
- 메모리의 주소를 잃어버린 경우
free
함수가 호출되어야 하는 상황에 호출되지 않은 경우
메모리 누수의 예
- 메모리 누수가 누적되면 힙 관리자가 사용할 수 있는 메모리 양이 감소하게 된다.
- 메모리 누수가 반복되면, 추가적인 메모리가 필요할 때
malloc
함수가 OOM(Out of Memory) 오류를 발생시키며 추가적인 메모리를 할당하지 못해 프로그램이 종료된다.
아래의 코드는 메모리 누수를 발생시키는 코드의 예이다. 변수 chunk
는 힙으로 부터 메모리를 할당받지만, 다른 메모리가 할당 되기전에 해제되지 않는다. 이 코드는 결국 OOM 오류를 발생시키고 비정상 종료된다.
메모리 주소 손실
- pi 포인터는 해제되지 않은 상태에서 새로운 메모리 주소가 재할당된다.
- pi 변수에 두 번째 메모리 주소가 할당될 때, 첫 번째 메모리의 주소는 손실된다.
아래의 그림에서 메모리 주소 Ox0E는 여전히 해제되지 않은 상태이며 프로그램 어디에서도 이 주소를 알지 못한다.

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

동적으로 할당된 메모리 주소 손실
숨겨진 메모리 누수
숨겨진 메모리 누수는 보통 프로그래머의 부주의에 때문에 발생한다.
- 대표적인 예로는
struct
키워드를 사용하여 생성한 구조체를 내부에 멤버 변수로 포인터 변수가 존재하는 경우이다. - 만약 구조체 내부에 동적으로 생성된 메모리의 포인터를 포함하고 있다면, 이 포인터는 구조체를 해제하기 전에 반드시 해제되어야 한다.