안녕하세요.

C++ 에서 2차원 배열을 동적으로 할당하고, 해제하는 방법입니다.


아래 코드에서는 string.h 를 inclue 하는데요, 메모리 관련 함수이면서 string.h 에 포함된 점이 특이합니다.

memory.h 를 사용해도 된다지만 string.h 가 표준이라고 합니다.


StakOverflow : How do I declare a 2d array in C++ using new?

링크의 답변 중에는 2차원 배열을 하나의 memory block 에 할당하는 방법(포인터들의 크기만큼 메모리 절약)에 대한 답변과,

new - delete 보다는 std::vector<int> 를 사용하라는 답변도 있습니다.


#include <string.h>   // memset 함수 사용을 위해 include
 
/* 메모리 할당 */ 
int **arr = new int*[sizeY];
for(int i = 0; i < sizeY; ++i) {
    arr[i] = new int[sizeX];
    memset(arr[i], 0, sizeof(int)*sizeX);   // 메모리 공간을 0으로 초기화
}
 
/* 메모리 해제 */
for(int i = 0; i < sizeY; ++i) {
    delete [] arr[i];
}
delete [] arr;


이상으로 C++ 에서 2차원 배열을 동적으로 할당하고, 해제하는 방법을 살펴 보았습니다.

도움이 되었기 바랍니다.


  1. L 2013.10.12 12:52
    죄송한데.
    메모리 해제할때, 거꾸로 해야되는거 아닌가요?
    arr[sizeY][sizeX] 이니깐.
    sizeX 부터요!!
    • BlogIcon FelixDies 2013.10.19 22:39 신고
      for loop 내의 sizeY 를 말씀하시는거죠? 여기서 i 는 sizeY 까지 증가하는 것이 맞습니다^^ 메모리를 해제할 때에는 sizeX 를 사용하지 않습니다. int arr[3][5] 를 생각해 보면, int 5개 짜리 배열이 3개 있다고 볼 수 있습니다. 이 배열에 할당된 메모리를 해제한다고 하면, 먼저 int 5개 짜리 배열 3개를 각각 해제하고, 배열 3개를 가리키는 arr 을 해제하는 것입니다. 설명이 좀 되었나요? 그림으로 그리면 더 설명이 쉬울텐데, 글로만 설명하려니 조금 복잡한 느낌이 있네요^^; int arr[3][5] 를 네모난 박스로 그려 보시면 도움이 될 것 같습니다. 블로그 방문해 주셔서 감사해요^^
  2. blower 2014.10.02 13:13
    간결한 정리 감사드립니다.