
동적 메모리 할당은 프로그램이 실행 중인 시점(런타임)에서, 필요한 메모리 공간을 할당하는 프로세스이다. 이는 프로그램이 실행되기 전에 메모리의 크기가 결정되지 않고, 실행 중에 프로그램의 요구에 따라 메모리의 크기가 결정되어 할당된다.
그냥 프로그램 별로 넉넉하게 메모리를 할당해 놓고 사용하면 되지 않겠나? 생각할 수 있다. 하지만 프로그램이 실행이 되면서 사용하는 메모리가 얼마나 필요할지는 사용자, 목적에따라 천차만별로 다르고 예상하기란 매우 어렵다.
그럼 그냥 최대치로 할당해 놓으면 되지 않나?
일단 메모리는 무한한 자원이다니다. 만약 그렇게 한다고해도 적게 사용할 때에도 무조건 한 프로그램에 최대치의 메모리가 할당되게 된다. 이는 엄청난 메모리 낭비로 이어지고 컴퓨터 성능에도 막대한 영향을 끼칠 것이다.
정리하면, 프로그램이 실행될 때, 데이터를 저장할 메모리 공간이 필요한데 일부 데이터는 컴파일 시점에 크기가 알려져 있어 정적으로 할당될 수 있다.(ex:전역변수) 하지만 많은 경우 실행 시점에서 데이터의 크기를 알 수 없거나 데이터의 크기가 실행 중에 변할 수 있다. 이럴 때 동적 메모리 할당을 사용한다. 사용이 끝난 메모리에 대해서넌 free함수로 메모리를 해제해주어 동적으로 관리해 더욱 깔끔하고 메모리를 효율적으로 사용할 수 있다.
힙 메모리 영역은 동적으로 할당되는 메모리를 관리하는데 사용되는, 프로그램 데이터 세그먼트 내의 영역이다.
아래 사진은 일반 적인 메모리 영역이다.

이런 메모리 영역은 프로그램을 실행할 때마다 생성되어 프로그램에 할당된다.
힙 영역은 런 타임에 프로그램의 필요 메모리 크기에 따라 결정되고
스택 영역은 컴파일 타임에 크키가 결정된다.
힙은 운영 체제의 메모리 관리 서브 시스템에 의해서 관리가 되어진다. 메모리 할당 요청을 받아 할당하고 할당된 메모리는 개발자가 사용하게 된다.
Heap 영역은 운영 체제의 시스템에 의해서 관리가 되어지지만 메모리가 생성된 후 에는 사용자가 직접 요청과 해제를 통해서 관리할 수 있는 메모리 영역이다. 때문에 직접 할당과 해제의 요청을 진행하면서 메모리를 관리해야 한다.
일반적으로,
C : malloc, free 메모리 관리 라이브러리를 통해서 요청과 해제가 이루어지고,
C++ 이 후에 나온 언어들은 new, delete 키워드를 사용하여 할당을 요청하게 된다.(언어 별로 다를 수 있음)
Heap 영역은 일반적으로 알고있는 자료구조 Heap(우선순위 큐)와는 전혀 다른, 전혀 무관한 개념이다.
프래그먼테이션이라고 한다.힙 메모리는 할당과 해제가 반복됨에 따라서 단편화가 이루어지게 되는데 이때 문제가 발생하게 된다.