자동 공간 / 정적 공간 / 동적 공간
C++에서는 데이터를 저장해 두기 위한 메모리를 대입하는 방법에 따라 3가지로 구분한다.
각각의 메모리 공간에 대입된 데이터 객체의 수명은 서로 다르다.
자동 공간 (automatic storage)
이 공간을 사용하는 함수 안에서 정의되는 보통의 변수들을 자동 변수 (automatic variable) 라고 한다.
➡️ 자동 변수 : 자신이 정의되어 있는 함수가 호출되는 순간에 자동으로 생겨나, 그 함수가 종료되는 시점까지만 존재함
자동변수의 특징
- 자신들을 포함하고 있는 블록 안에서만 유효하다 (블록 : 중괄호로 묶여진 코드의 일정 부분)
- 스택에 저장된다 (메모리상의 스택에 그 값이 순차적으로 저장되고 역순으로 해제되는 것)
정적 공간 (static storage)
프로그램이 실행되는 동안에 지속적으로 존재하는 공간이다.
정적으로 변수를 만드는 방법
- 함수의 외부에서 변수를 정의
- 변수를 선언할 때 static 이라는 키워드를 붙이기 (🔹Ex : static double fee = 56.50;)
동적 공간 (dynamic storage / 자유 공간 / 힙)
new와 delete 연산자를 사용해서 프로그램 실행(런타임) 동안에 자유롭게 빈 공간을 찾아 메모리를 할당해서 사용하고 해제한다.
이들은 자유 공간(free store)이라 부르는 메모리 풀(memory pool)을 관리한다. 이 풀은 자동 변수와 정적 변수가 사용하는 메모리와 분리되어 있다. new와 delete는 어떤 함수에서 메모리 대입하고, 다른 함수에서 그것을 해제할 수 있도록 해 준다.
따라서 데이터의 수명은 프로그램의 수명이나 함수의 수명에 얽매이지 않는다. (프로그래머의 delete를 사용하냐에 따라 수명이 달라질 뿐)
new와 delete를 함께 사용하면 일반 변수를 사용할 때보다 메모리에 대해 더 강력한 제어권을 가질 수 있다.
💡 new 연산자로 자유 공간(Heap)에 변수를 생성한 후 delete를 사용하여 이를 해제하지 않으면 어떤일이 일어날까?
: 메모리 누수 (memory leak)
자유 공간에 동적으로 대입된 변수나 데이터 객체는 그것을 지시하는 포인터를 포함하고 있는 메모리가 사용 범위와 객체 수명 규칙 때문에 해제된다고 하더라도 delete가 호출되지 않는 한 계속해서 살아남게 된다. 이러한 경우에 자유 공간에 생존하고 있는 변수나 데이터 객체에 접근할 수 있는 방도가 없어서 (변수나 데이터 객체가 저장되어 있는 메모리 위치를 지시하는 포인터가 이미 사라졌기 때문) 메모리 누수가 발생한다. 누수된 메모리는 프로그램을 실행하는 동안 내내 사용할 수 없게 된다. 즉 메모리가 대입은 되었으나 접근이 불가능하다.
메모리 누수가 심각하다면 일어나는 현상
- 극단적인 경우에는 애플리케이션에 할애된 메모리를 모두 소진할 수 있어서, 메모리 부족으로 프로그램이 먹통이 된다.
- 동일한 메모리 공간에서 운영되는 운영 체제나 다른 애플리케이션에도 부정적인 영향을 끼쳐, 망가뜨린다.
⚠️ 메모리 누수를 방지하기 위해서 new와 delete 연산자를 가능한 가깝게 결합하여 사용하는 습관을 들이자 ⚠️
(🔸자유 공간에 동적으로 변수나 데이터 객체를 대입하자마자 delete 연산자를 사용할 계획을 미리미리 잡자)
출처 및 참고 : C++ 기초 플러스
HyunZzang의 프로그래밍 공간 / 함께 공부해요!!
도움이 되셨다면 "좋아요❤️" 또는 "구독👍🏻" 부탁드립니다 :)