Channi Studies

[C++] 동적 메모리 할당 (Dynamic Memory Allocation) 본문

C++/포인터 (Pointers)

[C++] 동적 메모리 할당 (Dynamic Memory Allocation)

Chan Lee 2023. 12. 19. 22:04

동적 할당: Dynamic Memory Allocation

 

우리는 그동안 정적 할당을 통해 메모리를 할당하고 있었습니다.

정적 할당을 통하면, 컴파일을 할 때에 필요한 메모리가 할당되고, 이는 프로그램 종료시까지 변동되지 않습니다.

 

예를들어, 프로그램 내부에서 어떠한 정수 x를 선언하였다면,

그  변수의 값은 변할 수 있으나 변수에게 할당된 메모리는 끝까지 변하지 않습니다.

그 할당된 메모리는 sizeof 함수로 알 수 있었습니다.

 

그에 반해 동적할당은 컴파일을 할 때가 아닌, 런타임 도중에 메모리를 할당할 수 있게 해줍니다.

동적 할당을 통해 Heap 영역에 데이터를 할당할 수 있습니다.

즉, 동적 할당은 힙 영역에서 발생합니다.

그리고 그 할당된 값에 대한 접근은 포인터를 통해서만 가능합니다.

 

C++ 에서 동적 메모리의 할당은 new 키워드로 이루어집니다.

다음 코드로 살펴보겠습니다.

 

int *int_ptr{nullptr};
int_ptr = new int; // allocate an integer on the heap

cout << int_ptr << endl;  // 16진수 메모리 위치
cout << *int_ptr << endl; // garbage value
*int_ptr = 100;
cout << *int_ptr << endl; // 100

delete int_ptr	// 할당 해제

 

처음에 int_ptr라는 이름의 포인터를 만들었습니다.

이후 해당 포인터가 정수 크기의 메모리를 동적으로 할당받았습니다.

 

이 메모리에는 우리가 정적으로 변수를 선언할 때와는 다르게 이름이 없습니다.

그래서 위에서 서술하였듯 int_ptr 포인터를 통해서만 접근할 수 있습니다.

 

중요한 점은 이런 식으로 할당된 메모리는 garbage data를 담고 있습니다.

그렇기 때문에 초기화를 하지 않으면 오류가 발생합니다.

이후는 기존의 포인터의 개념과 동일합니다.

 

한가지 더 중요한 점은 할당한 메모리를 이용 이후 delete 키워드로 할당 해제 해주어야 합니다.

그렇지 않으면 동적 할당과 다를 바가 없겠죠?

 

 

배열의 동적 할당 

배열의 동적 할당 역시 다르지 않습니다.

단지 대괄호를 통해서 배열이라는 표시만 해 주면 됩니다.

#include <iostream>

using namespace std;

int main() {
  size_t size{};
  cout << "Enter the size of array: ";
  cin >> size;

  double *arr_ptr = new double[size];
  for (size_t i{}; i < size; i++) {
    arr_ptr[i] = i + 1;
    cout << arr_ptr[i] << endl;
  }

  delete[] arr_ptr;

  cout << endl;
  return 0;
}

 

배열에서도 역시 동일하게 할당된 메모리를 마지막에 해제해주어야 합니다.

이것은 delete 키워드 옆에 대괄호를 붙이는 것으로 할 수 있습니다. (delete[])

 


 

헷갈리는 부분을 ChatGPT에게 물어보면서 확인한 부분도 있는데,

꽤나 정확하고 정리된 정보를 제공해줍니다.

헷갈리는 부분에 대해서 물어보는 것도 좋을 것 같습니다.

 

chatgpt의 정적 배열 vs. 동적 배열에 대한 설명