본문 바로가기

BE/C++

[C++] 이차원 배열 동적할당하기

동적할당(dynamic memory allocation)이란?

특정 시점에 원하는 만큼 생성하고, 삭제할 수 있습니다.

C++ 에서는 new 생성자에 의해 생성되고, delete 에 의해 삭제됩니다.

즉, 메모리의 크기가 프로그램이 실행하는 동안 동적으로 결정되는 형태입니다. 
따라서 메모리의 할당 시점, 해제 시점을 개발자가 마음대로 정의할 수 있다는 장점이 있습니다.

또한, 정적변수는 메모리의 스택에 저장되는 반면 동적할당을 통해 선언한 변수는 메모리의 힙영역에 저장됩니다.

메모리 할당이란? 컴퓨터로부터 메모리를 얻어오는 일입니다. 즉, 메모리를 확보하는 과정입니다.

메모리 해제란? 확보한 메모리를 컴퓨터에 반납하는 과정입니다. 

메모리 누수란? 동적할당 후, 메모리를 해제하지 않으면 메모리의 사용량이 계속 증가하게됩니다. 이때, '메모리 누수(memory leak)'라 부릅니다.

 

이차원 배열 동적할당 방법

* 주의할 점 * 

1) 메모리 할당과 삭제는 항상 한 세트여야 합니다. 따라서 new를 사용했을 경우 delete 연산자를 꼭 선언해줘야 합니다. 

2) 해제 중복 : 해제한 메모리를 또 해제해 주어서는 안됩니다. 

 

1. 메모리 할당 (new int)  :

이차원 배열은 행과 열로 이루어져 있습니다. 행(row)을 먼저 할당하고 그 다음 열(column)을 할당합니다. 

행(row) 할당 : map = (int**) new int [행 사이즈] 을 통해 행을 할당(생성)합니다.

(col) 할당 : map[i] = new int[열 사이즈] 을 통해 열을 할당(생성)합니다. 

	int **map;
	map = (int**) new int[V];

	for (int i = 0; i < V; i++) {
		map[i] = new int[V];
	}

 

2. 메모리 해제 (delete) 
메모리를 해제할 때에는 할당과 반대로 열(column)을 먼저 해제하고 행(row)을 해제합니다. 

열 삭제 : delete map[열 인덱스] 을 통해 열을 삭제합니다. 

행 삭제 : delete map 을 통해 행을 삭제합니다. 

	for (int i = 0; i < V; i++) {
		delete map[i];
	}
	delete map;

 

3. 초기화와 출력

이차원 배열을 초기화하고 출력하는 코드입니다. 

//초기화
	for (int i = 0; i < V; i++) {
		for (int j = 0; j < V; j++) {
			map[i][j] = 0;
		}
	}
//출력
	for (int i = 0; i < V; i++) {
		for (int j = 0; j < V; j++) {
			cout << map[i][j];
		}
		cout << endl;
	}