Trattandosi di array, non di deallocano con `delete`, ma con `delete []`:
codice:
for(int i=0;i<o;i++) {delete[] M[i];delete[] m[i];};
for(int i=o;i<2*o;i++) {delete[] m[i];};
delete[] m;
delete[] M;
delete[] tmp;
(anche se alcuni compilatori tendono a perdonare questo errore)