Имя любого массива рассматривается компилятором как указатель на нулевой элемент массива. Так как имя двумерного динамического массива является указателем на указатель, то сначала выделятся память под указатели, а затем под соответствующие этим указателям строки. Освобождение выделенной памяти происходит в обратном порядке:
double **umas2;
umas2 = new double *[n];
for (i=0; i<n; i++)
umas2[i] = new double [m];
…
for (i=0; i<n; i++)
delete [ ]umas2[i];
delete [ ]umas2;