본문 바로가기

C++

([C++] 23강) 메모리 동적할당 new, delete

 

 

 

안녕하세요, 이번 시간에는 C++에서의 메모리 동적할당에 대해서 알아보겠습니다!

 

C언어에서 메모리의 동적할당에 대한 개념을 읽어 보셨나요?

 

적어도 메모리 동적할당에 대해 알아보려면

 

"배열은 포인터다" 라는 개념정도는 알고 계셔야합니다!

 

자 배열을 하나 만들어봅시다!

 

int arr[5];
int * ptr = arr;

int 배열 arr을 5의 길이만큼 만들고

 

그 0번째 요소의 주솟값을 ptr에 할당했습니다!

 

그럼 ptr의 값 부분에 접근해서 arr내의 요소를 수정할수 있겠네요!

 

하지만 만약에 내가 고정적으로 5의 길이가 아니고, 사용자에게 입력받은 입력값을

 

변수에 담아서, 그 길이만큼 배열을 만들수 있을까요?

 

위와같은 코드로는 불가능합니다, 하지만 동적할당으로는 가능하죠!

 

그냥 단순 변수를 만든다던지, 위 코드처럼 단순 배열을 만든다던지의 행위를

 

메모리가 자동으로 할당되지만, 할당된 메모리 크기를 조절할 수 없는 정적할당 이라고합니다

 

하지만, 이 메모리를 아예 내가 알아서 조절하고싶을때 사용하는 방법이 동적할당인겁니다!

 

 

 

 

 

 

 

정적할당의 장점은, 자동이기때문에 쉽고 또 메모리 해제또한 자동으로 됩니다만,

 

동적할당은 컴퓨터한테 "내가 알아서 메모리를 관리할테니까, 넌 이 메모리에서 손 떼!"

 

와 같기때문에 컴퓨터는 이 메모리를 자동으로 해제하지않습니다. 때문에 잘못 사용하면

 

"메모리릭" 혹은 "메모리누수" 혹은 "메모리낭비" 라고 부르는 심각한 문제가 발생할수있습니다.

 

메모리를 직접 조절함으로써 자율도는 높아지지만, 그만큼 신중한 관리가 필요하다는걸

 

꼭 기억해주셔야합니다!

 

 

 

 

 

 

 

자, 그럼 C언어에서의 메모리 동적할당은 어떤 기능을 사용했을까요?

 

바로 malloc, calloc, realloc, free 기억 나시나요??

 

하지만 C++에서는 단 두개로 통일됩니다

 

new, delete 인데요!

 

아주 쉽게 설명할수있겠죠?

 

 

 

new, 새로 만든다! 동적할당 메모리를 새로 만듭니다!

 

delete, 지운다! 동적할당 했던 메모리를 지운다!

 

 

 

자 그럼 바로 사용법을 알아볼까요??

new 만들자료형;

new는 위와 같이 사용합니다!

 

예시를 한번 보시죠!

int count = 10;
int * arr = new int[count];

 

위 예시는 int의 10개 크기만큼 메모리를 new! 만들어서 달라는겁니다.

 

만들어진 메모리의 주소는 arr에 할당되게 되겠죠! 이해 되시나요?

 

하지만, 위와같은 식으로 계속 쓰다보면 메모리가 계속 낭비됩니다!

 

왜냐하면 메모리를 해제해 주는 부분이 없어서 계속 쌓이기만 하니까요!

 

그럼 해제해주는 연산자인 delete를 사용해야겠죠? 사용법은 아래와 같습니다

 

delete 없앨메모리포인터;

이렇게 해주시면 되는데요!

 

단! 이 경우는 없앨 메모리포인터가 배열이 아닐경우입니다, 쉽게말하면 구조체 등을 동적할당 하는 경우도 있는데요,

 

이 경우에 위와같은 방법을 사용하고,

 

지금같이 동적할당된 메모리가 배열일 경우에는 앞에 []를 붙여주어야합니다.

delete []없앨배열메모리포인터;

이렇게 말이죠!

 

그럼 아까 new의 예제코드를 완성해서 새로운 코드를 만들어보겠습니다!

 

#include <iostream>

using namespace std;

int main() {
    int count;
    cout << "배열의 길이를 입력하세요 : ";
    cin >> count;
    int * arr = new int[count];
    
    for(int i = 0; i < count; i++) {
        arr[i] = i;
    }
    
    for(int i = 0; i < count; i++) {
        cout << arr[i] << " ";
    }
    
    delete []arr;
    return 0;
}

 

사용자에게 배열의 길이로 쓸 count변수에 값을 입력받고

 

arr배열을 count길이로 동적할당해서 0부터 count까지 넣어준 후

 

화면에 출력해주고 arr의 메모리를 다 썼으므로 해제까지 해주는 코드입니다!

 

이해가 되시나요?

 

 

 

 

아참! 마지막으로 배열을 동적할당하면서 값도 초기화 할 수 있는 방법이 있습니다!

 

int * arr = new int[5] {0,0,0,0,0};

 이렇게 해주면 int 5개의 배열이 만들어지며 요소가 전부 0으로 초기화됩니다!

 

쉽죠?

 

 

 

자 그럼 오늘은 메모리의 동적할당에 대해서 알아보았습니다.

 

메모리 동적할당은 C언어에서는 사실 자주 써야만 하는 개념은 아니였습니다만

 

이제 곧 나오게될 객체지향에서 자주쓰이게 되는 개념입니다.

 

꼭 기억해주세요!

 

수고하셨습니다!