C++ 動態配置二維陣列

  • 9142
  • 0

摘要:C++ 動態配置二維陣列

動態配置二維陣列不外乎都是利用下面這種方式

int i;
int data_height, data_width;
int **data;
p = new int*[data_height];
for(i = 0; i < data_height; i++)
    data[i] = new int[data_width];

可惜這種方式在釋放記憶體空間的時候就必須

for(i = 0; i < data_height; i++)
    delete [] data[i];
delete [] data;


不是很方便,且不能使用
memset(data[0], 0, sizeof(int)*data_height*data_width);
初始值為 0
以及用 memcpy() 複製值至另一個陣列


因此參考了程式設計俱樂部 記憶體配置問題 此篇文章
改寫原本用 malloc 動態配置二維陣列的方式
使用 new 的方式建立二維陣列

void* new2d(int h, int w, int size)
{
    register int i;
    void **p;

    p = (void**)new char[h*sizeof(void*) + h*w*size];
    for(i = 0; i < h; i++)
    {
        p[i] = ((char *)(p + h)) + i*w*size; 
    }
    return p;
}

因此就可以用這 function
動態建立二維陣列
data = (int **)new2d(data_height, data_width, sizeof(int));


為了增加閱讀方便,以及撰寫程式的方便
在程式前頭增加
#define NEW2D(H, W, TYPE) (TYPE **)new2d(H, W, sizeof(TYPE))



便可簡化剛剛動態配置二維陣列寫法
data = NEW2D(data_height, data_width, int);


此外此種動態配置記憶體的方法在釋放記憶體也比之前寫法方便多
delete [] data;
就可以釋放記憶體

 

以上文章轉載至 http://smalldd.pixnet.net/blog/post/10953132