프로그래밍 언어/C & C++ 정리

동적 메모리 다루기

뽀또치즈맛 2025. 2. 4. 22:26


메모리는 컴퓨터의 구성 요소에 속한다.
C++에서는 동적 메모리를 사용자가 직접 관리해야 하므로

크게

메모리의 작동 과정,
할당과 해제,
메모리 할당에 실패한 경우

이 3가지를 알아보자.

메모리 작동 과정

객체가 메모리에 할당 되는 방식을 머리 속에 자연스럽게
그려지는 것 부터 시작해보자.

네모 박스를 레이블이라 칭하고
이 레이블은 메모리를 가리키는 일종의 변수의 이름이라 생각하자.
이 레이블(상자)에 담긴 데이터는
그 메모리에 현재 저장된 값이다.

이제 객체가 메모리에 할당되는 과정을 떠올려 보았다.

이러한 객체가
정적할당 되는 경우에는
스택이라는 메모리 공간에 저장되어 컴파일 타임에
생명주기가 결정이 된다.

이러한 변수를 자동 변수라 하며
스코프에 따라 자동으로 해제되므로 자동 변수라 한다.

동적할당 되는 경우에는
힙이라는 메모리 공간에 저장되어 런타임에
생성되고 삭제되어
힙의 메모리가 사용하는 영역은
프로그램 실행 시기에 따라 가변적이다.

이러한 변수는
free store(자유 공간)에 저장된다(= 메모리가 할당된다).
즉, 동적 할당된 메모리는 늘 free store에 할당된다.

메모리 할당과 해제

C++에서 변수가 동적으로 할당되어
사용할 공간은 new 키워드로 생성한다.
다 사용했다면 이 공간을 프로그램의 다른 영역에서
사용할 수 없도록 delete해줘야 한다.

변수에 필요한 메모리 블록을 할당하려면
new에 그 변수의 타입을 지정해서 호출한다.
그러면 할당된 메모리에 대한 포인터가 리턴된다.
물론 이 포인터를 변수에 저장하는 작업은 프로그래머의 몫이다.

메모리 누수(=메모리 릭)


new의 리턴 값을 무시하거나
그 포인터를 담았던 변수가 스코프를 만나 생명주기가 끝난다면,
할당된 메모리에 접근할 수 없게 된다.
이를 메모리 누수 혹은 메모리 릭이라고 부른다.

속도가 빠른 메모리를 무한으로 공급할 수 있지 않기에
한 개체에 할당했던 메모리를 해제해야 다른 용도로 사용할 수 있다.
프리스토어(=힙 영역 = free store)의 메모리를 해제하려면
delete키워드에 해제할 메모리를 가리키는 포인터를 지정한다.

해제된 포인터나 갓 생성된 포인터는 꼭
nullptr or NULL로 초기화 해주자!

따라서 스마트 포인터가 아니라면 반드시
new 와 delete는 짝을 이뤄야한다.

malloc과 new

C언어에서 주로 사용하던 malloc과
C++의 new의 차이를 비교해보자.

한 번 생각해보자, 뭘까?
C++에서도 malloc을 사용할 수도 있는데
왜 new를 쓸까?

new는 단순히 메모리를 할당하는 데 그치지 않고
객체까지 만들어내기 때문이다.


따라서 C++에서는
malloc과 free대신 new와 delete사용을 적극 권장한다.

new와 동적할당의 실패


new가 늘 항상 제대로 처리될까?
아니다. 그렇지 않은 경우도 있다.

근데 왜 프로그래머 중에서 new의 동적할당 실패를
경험하지 못한 사람이 많을까?

그 이유는 new의 동적할당 실패의 경우가
메모리가 부족해서 상황이 굉장히 좋지 아니할 때만
실패하기 때문이다.

기본적으로 new가 할당에 실패하면 익셉션을 던진다.
예를 들어 요청한 메모리에 대한 충분한 공간이 없을 때 그렇다.
이때 발생한 익셉션을 잡지 않으면 프로그램이 종료되며
대부분의 경우에 이렇게 해도 괜찮다.

용량이 큰 게임을 돌리다가 게임이 강제 종료되는 게
이러한 경우 아닐까 싶다.

배열과 동적할당


배열은 타입이 같은 요소들의 집합으로
인덱스로 구분되는 것이 큰 특징이다.
동적할당 포스팅이니 vector가 빠질 수 없다.

동적 배열과 동적으로 할당된 배열은 다르다.
vector는 동적 배열이다.

동적으로 할당하는 배열은
배열을 할당하고 나면 원소의 개수가
변하지 않기 때문에 동적이지 않다.

동적 메모리는 할당된 블록의 크기를
실행 시간에 지정할 수는 있지만,
더 많은 데이터를 담을 수 있게
크기를 자동으로 조절할 수 없다.





'프로그래밍 언어 > C & C++ 정리' 카테고리의 다른 글

대입 연산자  (0) 2025.03.04
생성자  (0) 2025.02.19
그래서 다형성이 뭐라고요?  (0) 2025.01.12
인라인 함수  (15) 2024.12.29
인터페이스를 사용하기 쉽게 설계하기 (2)  (0) 2024.12.05