必要以上のメモリを消費しないように、2D配列を割り当てる関数があります。
_>
template <class Xvar> Xvar** New2 (unsigned int rows,unsigned int cols)
{
Xvar** mem;
unsigned int size, i;
size = rows * cols;
mem = new Xvar* [rows];
mem [0] = new Xvar [size];
for (i=1;i<rows;i++)
mem [i] = &mem [0][i*cols];
return mem;
}
次に、そのメモリが割り当てられているかどうかを確認する必要があります。(メモリ割り当てエラーを処理します)、関数のパフォーマンスを低下させることなく。
メモリ割り当てごとにtry-catchブロックを使用するか、関数に一意のtry-catchブロックのみを使用する必要があります。
template <class Xvar> Xvar** New2 (unsigned int rows,unsigned int cols)
{
Xvar** mem;
unsigned int size, i;
size = rows * cols;
try {
mem = new Xvar* [rows];
}
catch (...) { assert (...) }
try {
mem [0] = new Xvar [size];
} catch (...) { assert (...) }
for (i=1;i<rows;i++)
mem [i] = &mem [0][i*cols];
return mem;
}
または次のようなもの:
template <class Xvar> Xvar** New2 (unsigned int rows,unsigned int cols)
{
try {
Xvar** mem;
unsigned int size, i;
size = rows * cols;
mem = new Xvar* [rows];
mem [0] = new Xvar [size];
for (i=1;i<rows;i++)
mem [i] = &mem [0][i*cols];
return mem;
}catch (...) { assert (...) }
}
最初のnewが失敗した場合、memはNULLであるため、2番目の方法はお勧めできません。したがって、mem [0]を実行すると、割り当てられていないメモリにアクセスしているため、その時点でアプリケーションが失敗します。エラーをキャッチできません。