C++での多次元配列の作り方

今日久しぶりにC++やってnew char[x][y]って書いたらコンパイラに怒られたのでメモ。


1:コンパイル前に大きさが決まってる場合。

char str[5][5];


2:コンパイル後に動的に大きさをコントロールする場合。

int x = 5;
int y = 5;
char **str;
str = new char*[x];
for(int i = 0; i < x; ++i){
    str[i] = new char[y];
}

1はstr[0][0]からstr[n][n]まで領域が連続的に連なっている。
2はstr[n][0]からstr[n][n]までは領域が連続的に連なっている。str[n][n]とstr[n+1][n]までの間に領域の連続性は無い。


あとなんか、

int y = 5;
char (*str)[5];
str = new char[y][5];

こんなやり方もあるらしいけど、具体的に何やってんのか謎。


2008-10-11 : delete時の注意を書き忘れてたので追記。
1はスタックに入るからスコープ抜ければ勝手に消えるけど、2はnewを何回もやってるから破棄が面倒。
具体的には2の例で作った配列の場合、

for(int i = 0; i < x; ++i){
    delete [] str[i];
}
delete [] str;

とする必要がある。
作ったのと逆順でdeleteするだけだけど、いきなり delete [] str して破棄したつもりにならないように注意。