더북(TheBook)

그림 1-14는 변형된 2차원 배열 동적 할당의 동작 방식을 도식적으로 보여준다. p = new unsigned char*[h]; 문장이 수행되면 ‘동적 할당된 포인터형 공간ʼ이라고 표기된 메모리 공간이 할당된다. 그리고 그 아랫줄에서 영상 전체 픽셀 개수만큼의 데이터 공간을 할당하고 그 시작 주소를 p[0]에 저장한다. 그 다음 for 루프에서는 p[1]부터 p[h - 1] 변수가 영상의 두 번째 줄부터 마지막 줄의 시작 위치 주소를 가리키도록 설정하였다. 그리고 memset(p[0], 0, w * h); 문장은 할당된 전체 데이터 공간의 값을 0으로 초기화한다.

그림 1-14 변형된 2차원 배열 동적 생성 코드의 동작

이렇게 할당된 메모리 공간에 접근하는 방법은 2차원 배열을 사용하는 방식과 완전히 동일하다. 그러므로 2차원 동적 배열 p의 모든 원소의 값을 1씩 증가하는 C/C++ 코드는 앞에서 설명한 것과 동일하게 이중 for 루프를 이용하여 구현할 수 있다. 다만 변형된 2차원 배열 동적 생성 방법을 사용하면 단일 for 루프를 이용하여 1차원 배열처럼 원소 값을 참조할 수 있다. 다음 소스 코드를 살펴보자.

unsigned char* p1 = p[0];
for (int i = 0; i < w * h; i+ +)
{
    p1[i] = p1[i] + 1;
}

위 소스 코드에서는 unsigned char* 타입의 변수 p1p[0]을 할당하고, p1 변수를 1차원 배열처럼 사용하고 있다. for 루프에서는 배열의 전체 크기인 (w * h)만큼을 반복하면서 전체 원소에 1을 더하는 것을 볼 수 있다.

변형된 방식으로 할당했던 2차원 동적 배열 또한 사용이 끝나면 사용자가 직접 메모리를 해제해주어야 한다. 메모리 해제는 delete[] 연산자를 사용하며 메모리 할당했던 방식을 거꾸로 진행하면 된다. 실제 코드는 아래와 같다.

delete[] p[0];
delete[] p;

실제 new 연산자로 메모리 공간을 할당 받은 것이 두 번이었으므로 delete[] 연산을 하는 것 또한 두 번이면 충분하다. p[0]에 할당된 메모리 공간을 먼저 delete하고, 그 다음에 pdelete하는 순서만 주의하면 된다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.