동적할당은 정적할당과 반대되는 개념이다. 정적할당은 프로그램 실행 이전에 메모리가 할당되는 것을 의미한다. 이와 반대로 동적할당은 프로그램 실행 중 메모리가 할당된다.
메모리의 할당은 다른 언어에 비해 C와 C++에서 많이 언급되는 내용 중 하나다. 그 이유는 C와 C++에서 사용자가 힙 영역에서 메모리를 할당할 수 있도록 길을 열어주기 때문이다. C에서는 malloc()와 free()로 메모리를 할당하고 해제했다. C++에서는 new와 delete를 지원한다.
C++에서 동적할당을 위해 연산자 키워드로 new를 사용한다. 그리고 new로 할당한 메모리는 delete로 할당 해제한다.
int *ptr = new int ;
delete ptr;
new는 확보한 공간의 주소를 반환하므로 값을 저장할 변수는 포인터 변수여야만 한다.
#include <iostream>
using std::cout;
using std::endl;
int main()
{
int* pnum = new int[2];
delete[] pnum; //배열의 경우에는 이렇게 대괄호를 표시해 전체를 해제해줘야해요.
int num = 3;
float* pfloat = nullptr;
pfloat = new float[num]; // 배열 동적할당
for (int i = 0; i < num; i++) {
pfloat[i] = i + 1.1;
cout << "pfloat[" << i << "] :" << pfloat[i] << " ";
}
cout << endl;
delete[] pfloat;
double* pdouble{new double[5]};
delete[] pdouble;
return 0;
}
배열의 동적할당과 할당 해제에는 대괄호를 붙여줘야 한다. delete pfloat를 한다면 배열의 첫 번째 요소의 메모리만 해제되므로 주의를 요한다.
또한 주의해야할 것이 있다. 배열의 동적할당은 배열이 동적이라는 것이 아니다. 배열이 동적이라는 것은 배열의 크기가 vector처럼 늘었다 주는게 가능한 것을 의미한다. 배열의 동적할당은 배열의 크기를 프로그램이 실행 중에 정한다는 의미이다.
/******3x4 이차원 배열 할당******/
int** arr = new int*[3];
for(int i=0; i<3; i++)
arr[i] = new int[4];
/*****************************/
/**********할당 해제***********/
for(int i=0; i<3; i++)
delete[] arr[i];
delete[] arr;
/*****************************/