[C++] 메모리 동적 할당이 뭐에요?

2022. 6. 15. 13:06♣ C++

이번 포스팅에선 메모리 동적 할당에 대해 알아보도록 하겠습니다.

메모리 동적 할당 : 힙 영역에 할당될 메모리를 사용자가 직접 할당했다가 끊었다가 하는 활동

 

개발 환경 : VSCode, Windows 10

 

 

 

 

[본 포스팅은 메모리 구조에 대한 사전 지식이 필요합니다!]

https://mengu.tistory.com/74

 

[CS지식] 메모리 구조에 대하여

메모리의 구조 프로그램이 실행되기 위해선 메모리에 로드되어야 합니다. 또한 프로그램의 변수들이 메모리에 저장되어야 합니다. 이에 운영체제들은 여러 메모리 영역들을 제공하고 있습니다

mengu.tistory.com

 

 

 

 

 

기본 개발 세팅은 다음과 같습니다.

#include <iostream>
#include <string.h>
using namespace std;

int main()

{    
    // pointer
    int num1 = 10;
    int num2 = 4;
    cout << "pointer 예시 \n";
    return 0;
}

 

 

 

 

 

📌 메모리 동적 할당 (dynamic allocation)

 

데이터, 스택 영역에서 할당되는 메모리의 크기는 컴파일에 결정됩니다. 하지만 힙 영역의 크기는 런 타임에 사용자가 직접 결정합니다. 런 타임에 사용자가 직접 메모리를 할당받는 것을 메모리의 동적 할당이라고 합니다. 메모리 동적 할당은 힙 영역에서 이뤄집니다.

 

🕵️‍♀️ [물음] 왜 메모리 동적 할당이 필요할까요?

🦸‍♂️ [답변]

(1) 대용량의 데이터를 써야 할 때, 포인터로 잡았다가 사용하지 않을 때 해제시킴으로써 저장 공간 효율성을 높일 수 있습니다.

(2) 데이터, 스택 영역은 일정 범위를 넘어서면 변수가 파괴된다는 특성이 있습니다. 하지만 힙 영역의 데이터들은 할당하고 두고두고 쓸 수 있다는 점에서 효용성을 가집니다. 

 

 

 

 

 

 

🎨 메모리 동적 할당 코드

 

 

1. 메모리 동적 할당은 new 연산자를 통해 처음 메모리를 열어줍니다. 

타입 *변수 이름 = new 타입;

 

예시

int main()
{    
    int *ptr_num1 = new int;
    *ptr_num1 = 1004;
    cout << "new를 통해 동적 할당된 ptr_num1의 값은 " << *ptr_num1 << " 입니다." << endl;
    cout << "new를 통해 동적 할당된 ptr_num1의 주소값은 " << ptr_num1 << " 입니다." << endl;
}

 

 

결과

new를 통해 동적 할당된 ptr_num1의 값은 1004 입니다.
new를 통해 동적 할당된 ptr_num1의 주소값은 0xfb1a88 입니다.

 

 

 

 

 

2. new를 통해 할당했던 메모리를 delete를 통해 다시 해제시킵니다.

 

할당되었던 메모리가 다시 돌아가기에, 메모리를 절약할 수 있습니다. 반드시 new 연산자를 사용한 이후에 사용되어야 하는 연산자입니다.

delete 변수 이름;

 

예시

int main()
{    
    int *ptr_num1 = new int;
    *ptr_num1 = 1004;
    cout << "new를 통해 동적 할당된 ptr_num1의 값은 " << *ptr_num1 << " 입니다." << endl;
    cout << "new를 통해 동적 할당된 ptr_num1의 주소값은 " << ptr_num1 << " 입니다." << endl;

    delete ptr_num1;
}

 

 

 

예시 2

int main()
{    
    int *ptr_num1 = new int;
    *ptr_num1 = 1004;
    cout << "new를 통해 동적 할당된 ptr_num1의 값은 " << *ptr_num1 << " 입니다." << endl;
    cout << "new를 통해 동적 할당된 ptr_num1의 주소값은 " << ptr_num1 << " 입니다." << endl;

    delete ptr_num1;

    // 해제 시키고 다시 delete를 한다면?
    delete ptr_num1;
}

 

해제시킨 후, 다시 delete 연산자를 사용하면 오류가 발생합니다. 잘 체크해서 써야 합니다.

 

 

 

 

 

 

지금까지 메모리 동적 할당에 대해 알아보았습니다.

초기 단계에선 메모리 동적 할당이 왜 필요한지 모를 수 있습니다. 하지만 가면 갈수록 그 유용성이 드러날 것입니다. 이번 포스팅은 여기까지 하겠습니다. 고생하셨습니다.