동적 메모리 할당
말 그대로 동적으로 메모리를 할당하는 것
- 메모리를 자유롭게 할당하고 해제할 수 있는 heap 공간을 이용한다.
- 자유롭게 할당할 수 있는 만큼 메모리 누수(memory leak)가 일어나지 않도록 해제를 꼭 제대로 해야함에 유의한다.
동적 메모리 할당하기
- 동적 메모리를 할당하기 위해 사용되는 키워드는 new와 delete이다.
- new는 동적 메모리를 할당하고, delete는 동적 메모리를 해제한다.
포인터에 동적 메모리 할당하기
- 포인터에 동적 메모리를 할당하는 방법은 다음과 같다.
// 동적 메모리 할당
datatype* ptr = new datatype;
// 동적 메모리 해제
delete ptr;
Ex) 간단한 예제
#include <iostream>
using namespace std;
int main() {
int* ptr = new int; // 동적 메모리 할당
*ptr = 10;
cout << *ptr << endl;
delete ptr; // 동적 메모리 해제
return 0;
}
10
- int 크기만큼의 동적 메모리(heap)를 할당하여 포인터 ptr에 대입한다.
- ptr을 모두 사용하고 난 후, delete 키워드를 이용하여 포인터에 할당된 동적 메모리를 해제하였다.
동적 배열
- C에서와 동일하게 동적 메모리 공간을 갖는 배열을 생성할 수 있다.
- 동적 배열은 다음과 같이 정의한다.
// 동적 메모리 할당
datatype* ptr = new datatype[size];
// 동적 메모리 해제
delete[] ptr;
Ex) 배열에 동적으로 메모리 할당하기 (1차원 배열)
#include <iostream>
using namespace std;
int main() {
int size = 10;
int* list = new int[size]; // 배열에 동적 메모리 할당
for (int i = 0; i < size; i++) {
list[i] = i;
}
for (int i = 0; i < size; i++) {
cout << list[i] << " ";
}
delete[] list; // 동적 메모리 해제
return 0;
}
0 1 2 3 4 5 6 7 8 9
- 원래 배열은 정적으로 메모리를 할당해야 하지만, new 키워드를 통해 heap 메모리를 활용하여 동적으로 메모리 공간을 할당할 수 있다.
- 동적 메모리 공간을 할당하였으므로 사용이 끝나면 마지막에 delete를 이용하여 메모리를 해제해야 함에 유의하자
Ex) 배열에 동적으로 메모리 할당하기 (2차원 배열)
#include <iostream>
using namespace std;
int main() {
int row = 2, column = 5;
int** mat = new int*[row]; // 2차원 배열의 row 크기 할당
for (int i = 0; i < row; i++) {
mat[i] = new int[column]; // row 마다 column 크기 할당
}
// 값 대입하기
int k = 0;
for (int i = 0; i < row; i++) {
for (int j = 0; j < column; j++) {
mat[i][j] = k;
k++;
}
}
// 출력하기
for (int i = 0; i < row; i++) {
for (int j = 0; j < column; j++) {
cout << mat[i][j] << " ";
}
cout << endl;
}
// 동적 메모리 해제
for (int i = 0; i < row; i++) {
delete[] mat[i]; // row마다 column의 동적 메모리를 해제
}
delete[] mat; // 이후 row의 동적 메모리를 해제
return 0;
}
0 1 2 3 4
5 6 7 8 9
- row - column 순으로 동적 메모리를 할당하고, 해제할 때는 반대로 column, row 순으로 메모리를 해제한다.