C++/C++ 기초

[C++] 메모리의 동적할당 ( Dynamic allocation )

Song 컴퓨터공학 2023. 5. 4. 13:56

 

https://blog.naver.com/songsite123/223044574844

 

동적 메모리 할당(Dynamic Memory Allocation) 및 해제

동적 메모리 할당을 알아보기에 앞서 정적 메모리 할당의 한계점을 하나 짚고 넘어가겠습니다. 앞선 포스팅...

blog.naver.com

위 포스팅에서 C 언어를 통해 메모리의 동적할당 법에 대해 배워봤습니다. C는 malloc() 함수나 realloc(), calloc() 함수 등을 이용해 메모리 동적할당을 하고, free() 함수를 통해 메모리 공간을 해제합니다.

 

그러나 C++ 에서는 조금 다른 new 연산자와 delete 연산자를 통해 동적할당을 진행합니다. 간단히 동적할당이란 무엇인가에 대해 복습해보고, new 연산자와 delete 연산자를 통한 C++ 에서의 동적할당에 대해 알아보겠습니다.

 


 

메모리 동적 할당(Dynamic allocation)

 

데이터 영역과 스택 영역에 할당된느 메모리의 크기는 컴파일 타임(Compile time)에 미리 결정됩니다. 그러나 힙 영역의 크기는 프로그램이 실행 도중인 런 타임(Run time) 에 사용자가 직접 결정합니다. 런 타임에 메모리를 할당 받는 것을 메모리의 동적 할당 이라고 합니다.

 

포인터의 가장 큰 목적이 런 타임에 이름 없는 메모리를 할당 받아 포인터에 할당하여, 할당받은 메모리에 접근하는 것입니다. C++ 에서도 C 언어의 라이브러리 함수를 통해 동적할당을 할 수 있지만 더욱 효과적인 new 연산자와 delete 연산자를 제공합니다.

 

 


new 연산자

 

C언어에서의 malloc() 함수 같은 역할을 하는 new 연산자의 사용 문법입니다.

타입* 포인터이름 = new 타입;

첫 번째 타입은 데이터에 맞는 포인터를 선언하기 위해, 두 번째 타입은 메모리의 종류를 지정하기 위해 사용됩니다.

만약 사용할 수 있는 메모리가 부족하여 새로운 메모리를 만드는데 실패하면 NULL 포인터를 반환합니다.

 

new 연산자는 자유 기억 공간(free store) 라 불리는 메모리 공간에 객체를 위한 메모리를 할당받습니다.

또한, new 를 통해 할당받은 메모리는 따로 이름이 없으므로 해당 포인터로만 접근할 수 있습니다.

 


delete 연산자

C 언어에서의 free() 함수 역할을 하는 연산자입니다. C++ 에서는 더 사용하지 않는 메모리를 다시 메모리 공간에 돌려줄 때 delete 연산자를 사용합니다.

delete 포인터이름;

간단한 예제 코드로 new 와 free 를 사용해 데이터를 출력해주고 다시 해제하는 코드입니다.

 

사용 주의점으로는

 

new 연산자를 통해 생성한 메모리가 아닌 변수를 선언하여 생성한 메모리는 delete 연산자로 해제할 수 없습니다. delete 연산자는 반드시 new 연산자를 통해 할당된 메모리를 해제할 때만 사용해야 하고, 한 번 해제한 메모리를 다시 해제하려고 하면 오류가 발생합니다. 또한 다 사용했으면 delete 연산자를 까먹지 말고 사용해줘서 메모리 누수를 막아야 겠죠?

 

여기까지 간단하게 C++에서 new 연산자와 delete 연산자를 통해 동적할당 / 해제 하는 법에 대해 알아보았습니다. 감사합니다.