多次元配列

Wさんのソースを読んでいて驚いたこと。こんな部分があった。

int** Image = new int*[nX];
Image[0] = new int[nX*nY];
for( int x = 0; x < nX; ++x ){
	Image[x] = Image[0] + x * nY;
}

・・・・・・

delete Image[0];
delete Image;

最初、何をやっているのかわからなかった。ポインタをずらしながら格納?とか思っていたのだがしばらく考えてやっとわかった。2次元配列を連続メモリとして確保していたのだ。普通、2次元配列を動的確保しようと思ったら、

int** Image = new int*[nX];
for( int x = 0; x < nX; ++x ){
	Image[x] = new int[nY];
}

・・・・・・・

for( int x = 0; x < nX; ++x ){
	delete Image[x];
}
delete Image;

とするのが普通だが、この方法だとメモリの連続性は保障されない。ていうか普通はバラバラになる。しかしWさんのような方法だと全メモリが連続になり普通の多次元配列同様連続性が保障されていろいろ嬉しい。この方法結構感動しました(^^; 結構使えるんじゃないかなと。 ・・・て、ひょっとして定番の技?(汗

ちなみに、元のソースは上記みたいに単純ではなく、3次元配列のうちの2次元をやっていたのでますます分けわからんでした(^^; 
ところで、3次元をすべて連続メモリにするにはどうしたらいいか?ちょっとした応用の勉強でやってみました。

int*** Image = new int**[nX];
int* temp = new int[nX*nY*nZ];
for( int x = 0; x < nX; ++x ){
	Image[x] = new int*[nX];
	for( int y = 0; y < nY; ++y ){
		Image[x][y] = temp + ( ( x * nY ) + y ) * nZ;
	}
}

・・・・・・・

delete **Image;
for( int x = 0; x < nX; ++x ){
	delete Image[x];
}
delete[] Image;

こんな感じでしょうかね?