본문 바로가기
Software/C++&MFC

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

by lovey25 2019. 2. 28.
반응형

필요성

동적할당이 왜 필요할까요?

동적메모리 할당은입력갑에 의존적인 프로그램을 만들어야 할 경우 유용하게 쓰일 수 있습니다. 예를들어 사진이나 영상 등 어떤 파일을 읽어야 하는데 읽기 전에는 그 크기를 모르기 때문에 메모리에 얼마나 공간이 필요한지 알수가 없는데 이럴때는 동적할당이 꼭 필요합니다.

다음과 같은 코드를 컴파일 해보면 컴파일 에러가 납니다.

int i = 5; 
int arr[i]; 

i라는 변수에 5가 할당되니까 정수형 배열 “arr[i]”은 정수형 x 5개 만큼의 크기가 필요하다는 것이 자명한데 왜 에러가 날까요? 

이유는 컴파일시에 변수 i 가 정수형이라는 것만 정해지지 여기에 값 5가 들어가는건 프로그램이 실행될 단계에서 일어나는 일이라고 합니다. 그래서 컴파일러는 “i”에 뭐가 들어가있는지 모르기 때문에 얼마만큼의 크기를 arr배열로 할당해 줘야 하는지 혼란스러운거죠.

C++의 메모리 영역

C++ 프로그램이 사용하는 메모리는 다음 3가지로 구분되어 있습니다.

  • DATA: 전역변수와 스택변수가 저장되는 곳
  • STACK: 모든 지역변수들이 저장되는 곳
  • HEAP: 할당해야 할 메모리크기를 프로그램의 실행중에 결정해야 하는 경우 사용할 수 있는 메모리 (동적할당)

 바로 이 HEAP영역을 사용하기 위해서 동적할당이 필요하고 동적할당을 위해서는 포인터를 사용해야 합니다.

포인터를 활용한 동적할당

new

이제 동적할당의 방법에 대해서 알아보겠습니다. 메모리에 할당된 주소는 포인터에 저장될 수 있고 역참조를 통해서 변수에 접근할 수 있습니다.

int *p = new int; 
*p = 5; 

예제에서 변수 “p”는 포인터로 만들었습니다. 그리고 “new”라는 명령어를 사용해서 정수형 변수를 메모리에 동적으로 할당했고 5라는 값을 지정하였습니다. 

여기서 포인터 “p”의 위치는 스택입니다. 그리고 힙에 할당된 주소값이 저장되어 있습니다. 숫자 5라는 값이 저장된 실제 위치는 힙이 되는것이죠.

delete

이제 동적할당을 통해서 힙이라는 메모리 영역을 사용할 수 있게 되었습니다. 그런데 여기서 우리는 메모리 관리라는 개념에 유의해야 합니다.

스택에 있는 변수의 경우 메모리관리는 자동으로 이루어 집니다. 그렇지만 힙에서는 동적으로 할당된 메로리는 수동으로 직접 관리해 주어야 합니다. 그래서 더이상 사용하지 않을때는 “delete” 명령어를 사용해서 메모리를 해제시켜주어야 합니다.

int *p = new int; 
*p = 5;  
// 값을 사용한 어떤 동작이 뚝딱뚝딱  
delete p;  

이렇게 사용이 끝나고 나서는 “delete [포인터이름]”으로 힙의 메모리를 해제시켜줄수 있습니다. delete 명령어는 동적으로 할당된 메모리를 해제하지만, 포인터 자체를 지워주진 않습니다. 포인터는 스택에 저장되어 있으니까요. 이렇게 존재하지 않는 메모리의 위치를 가르키는 남아있는 포인터를 dangling pointers라고 부릅니다. 한국어로는 어떻게 번역되어 사용되는지 잘 모르겠네요.

배열

동적 메모리는 배열을 통해서도 할당될 수 있습니다. 

int *p = NULL; 
p = new int[20]; 
delete [] p;  

그럼 맨처음에 살펴봤던 컴파일 오류가 있던 코드를 동정할당을 통해서 고쳐주려면 어떻게 해야 할까요?

다음과 같이 사용해주면 됩니다. 그리고 사용이 끝나고 나면 메모리 해제도 꼭 기억해야 겠죠.

int i = 5; 
int *arr = new int[i]; 
delete [] arr; 

이상 동적할당에 대해서 알아봤습니다.

 

끝!

반응형

댓글