Для такого массива нужно выделять память в цикле, или сразу одним большим блоком, но записывать в массив указатели с шагом в строку.
int** Allocate2dArray(int w, int h)
{
int** a;
// сначала выделяем память под указатели на столбцы
a = new int*[w];
for (int i = 0; i < w; ++i)
{
// выделяем память под каждый столбец
a[i] = new int[h];
}
return a;
}
или так
int** Allocate2dStraight(int w, int h)
{
int** a;
a = new int*[w];
// одним махом выделяем память под все столбцы
*a = new int[w * h];
for (int i = 1; i < w; ++i)
{
// и просто раздаём адреса
a[i] = a[i-1] + w;
}
return a;
}
и удалять в обратном порядке.