C++ 메모리 구조

soominlee·2023년 3월 20일
0

CPP

목록 보기
1/1
post-thumbnail

History...
C++ 코드를 짜다 메모리 누수 문제를 마주쳤다.
자꾸 코드가 실행 중에 죽었다.
컴파일은 잘 되서 도대체 원인이 뭐 때문인건지 미쳐버리겠다가 메모리 누수 때문일거라는 말을 들었다.
"메모리 누수.. 메모리가 세고있다는 말.. 메모리를 막 쓰고 있다는 말인데.."
메모리 할당과 해제와 관련이 있다는건 대충 알았지만, 내 코드에서 그 누수 지점을 찾기엔 내 눈엔 보이지 않았다.
메모리 누수가 왜 일어나는지 정확히 숙지하고,
어떻게 해결해야하는지 찾아보기 위해 메모리 누수에 대해서 찾아보았고,
생각보다 내 기초가 정말 빈약하다는 사실을 맞닥드렸다.
그래서 기초부터 간단하게 정리한 후 메모리 누수에 대해서 정리하려고 한다.

🔴 메모리 구조
: 프로그램을 실행할 때 운영체제에서는 프로그램이 동작할 수 있게 4가지 영역의 메모리를 할당한다.

Code 영역
: 실행할 코드가 저장되어 있는 영역
1. 메모리에 코드를 올려놓고 순서대로 실행하도록 한다.
** 코드의 길이가 너무 길면 안되는 이유이다.

Data 영역
: 전역 변수와 Static 변수들이 저장되어 있는 영역

  1. 프로그램이 종료되면 해제된다.
  2. 컴파일 타임에 메모리 크기가 할당된다.
    *전역 변수를 너무 남발하면 안되는 이유이다.

Stack 영역

  1. 지역 변수와 매개변수들이 저장되어 있는 영역
  2. 함수 호출과 함께 할당이 되며(컴파일 타임) 호출이 완료되면 소멸된다.
  • stack flow : stack 영역에 저장되는 함수 호출에 대한 정보를 가리키는 말
    ** 함수 호출에 대한 정보: 매개변수, 반환 주소값, 함수 내 지역변수

  • stack overflow : stack의 여유 공간이 없을 때 stack frame을 저장하려 할 때 발생하는 문제

    • 함수가 너무 깊게 호출되는 경우
    • 함수 내 지역변수가 너무 많은 경우

    ⚠️ 위 경우가 아니더라도 overflow가 발생할 수 있다. 이럴 땐 동적 할당을 활용하여 해결하도록 한다.

Heap 영역
: 동적으로 할당되는 영역. 사용자가 직접 할당하고 해제함
1. 해제를 제대로 하지 않으면 메모리 누수 발생
2. 할당할 메모리의 크기는 런타임에 결정된다.

  • 동적 할당하는 경우
  1. 배열의 크기를 미리 결정할 수 없을 때
  2. 변수가 일시적으로만 필요한 경우 (stack 메모리 관리)
  3. 함수가 종료되고도 메모리를 살리고 싶은 경우
  • 동적 할당 방법
    - malloc (C), new (C++) : 할당 성공 시 메모리의 주소 값을 return
    malloc : void* 타입을 return하기 때문에 형변환 필요, 선언 시 할당할 메모리의 크기를 명시함
    new : 타입 safe이므로 타입 변환이 필요 없음, 선언 시 할당할 size type을 명시함

  • 메모리 누수를 피하는 법
    malloc : free 로 메모리 해제
    new : delete 메모리 해제

    free와 delete로 메모리를 잘 해제해줬어도 메모리 누수가 발생할 수 있다.

    ex) 동적 할당 받은 메모리 위치를 변수에 저장한 후 대입으로 다른 값을 넣었을 시, 처음에 할당받은 메모리 위치에 대한 접근 방법 유실로 인해 해당 메모리를 해제할 방법이 없어 메모리 누수가 발생함.

profile
Soominlee

0개의 댓글