History...
C++ 코드를 짜다 메모리 누수 문제를 마주쳤다.
자꾸 코드가 실행 중에 죽었다.
컴파일은 잘 되서 도대체 원인이 뭐 때문인건지 미쳐버리겠다가 메모리 누수 때문일거라는 말을 들었다.
"메모리 누수.. 메모리가 세고있다는 말.. 메모리를 막 쓰고 있다는 말인데.."
메모리 할당과 해제와 관련이 있다는건 대충 알았지만, 내 코드에서 그 누수 지점을 찾기엔 내 눈엔 보이지 않았다.
메모리 누수가 왜 일어나는지 정확히 숙지하고,
어떻게 해결해야하는지 찾아보기 위해 메모리 누수에 대해서 찾아보았고,
생각보다 내 기초가 정말 빈약하다는 사실을 맞닥드렸다.
그래서 기초부터 간단하게 정리한 후 메모리 누수에 대해서 정리하려고 한다.
🔴 메모리 구조
: 프로그램을 실행할 때 운영체제에서는 프로그램이 동작할 수 있게 4가지 영역의 메모리를 할당한다.
✅ Code 영역
: 실행할 코드가 저장되어 있는 영역
1. 메모리에 코드를 올려놓고 순서대로 실행하도록 한다.
** 코드의 길이가 너무 길면 안되는 이유이다.
✅ Data 영역
: 전역 변수와 Static 변수들이 저장되어 있는 영역
✅ Stack 영역
stack flow : stack 영역에 저장되는 함수 호출에 대한 정보를 가리키는 말
** 함수 호출에 대한 정보: 매개변수, 반환 주소값, 함수 내 지역변수
stack overflow : stack의 여유 공간이 없을 때 stack frame을 저장하려 할 때 발생하는 문제
⚠️ 위 경우가 아니더라도 overflow가 발생할 수 있다. 이럴 땐 동적 할당을 활용하여 해결하도록 한다.
✅ Heap 영역
: 동적으로 할당되는 영역. 사용자가 직접 할당하고 해제함
1. 해제를 제대로 하지 않으면 메모리 누수 발생
2. 할당할 메모리의 크기는 런타임에 결정된다.
동적 할당 방법
- malloc (C), new (C++) : 할당 성공 시 메모리의 주소 값을 return
malloc : void* 타입을 return하기 때문에 형변환 필요, 선언 시 할당할 메모리의 크기를 명시함
new : 타입 safe이므로 타입 변환이 필요 없음, 선언 시 할당할 size type을 명시함
메모리 누수를 피하는 법
malloc : free
로 메모리 해제
new : delete
메모리 해제
free와 delete로 메모리를 잘 해제해줬어도 메모리 누수가 발생할 수 있다.
ex) 동적 할당 받은 메모리 위치를 변수에 저장한 후 대입으로 다른 값을 넣었을 시, 처음에 할당받은 메모리 위치에 대한 접근 방법 유실로 인해 해당 메모리를 해제할 방법이 없어 메모리 누수가 발생함.