동적 2차원 배열의 기본 개념
C++에서 new 연산자로 생성한 동적 2차원 배열은 본질적으로 '배열을 가리키는 포인터들의 배열'입니다. 따라서 먼저 이중 포인터 형태의 포인터 배열을 할당한 뒤, 반복문을 사용해 각 행에 해당하는 1차원 배열을 개별적으로 초기화해야 합니다.
예제 코드
#include<iostream>
using namespace std;
int main() {
int rows = 3, cols = 4;
// 1단계: 포인터 배열(행) 할당
int** arr = new int*[rows];
// 2단계: 각 행에 대해 1차원 배열(열) 할당
for(int i = 0; i < rows; ++i)
arr[i] = new int[cols];
return 0;
}위 코드를 실행하면 크기가 3×4인 2차원 배열이 생성됩니다. 여기서 arr은 행을 가리키는 포인터들의 배열이며, 각 포인터는 다시 열 개수만큼의 정수 배열을 가리킵니다.
메모리 해제 시 주의사항
동적으로 할당한 메모리는 반드시 할당의 역순으로 해제해야 합니다. 즉, 먼저 각 1차원 배열들을 삭제한 후, 마지막에 포인터 배열 자체를 삭제해야 합니다. 순서를 지키지 않거나 해제를 누락하면 메모리 누수(memory leak)가 발생할 수 있습니다.
// 메모리 해제 - 반드시 할당의 역순으로 진행
for(int i = 0; i < rows; ++i)
delete[] arr[i]; // 각 1차원 배열부터 해제
delete[] arr; // 마지막에 포인터 배열 해제참고: 더 안전한 현대적인 대안
실무 환경에서는 수동 메모리 관리의 실수를 줄이기 위해 std::vector<std::vector<int>>와 같은 컨테이너를 사용하는 것이 권장됩니다. RAII 원칙에 따라 소멸 시점에 메모리가 자동으로 해제되므로, 위와 같은 new/delete 조합보다 훨씬 안전하고 유지보수하기 쉽습니다.