Hola aguml.
En base, no existen arreglos bidimensionales en C/C++. Lo que existen son arreglos unidimensionales de elementos, donde cada uno de ellos es un arreglo.
El operador delete sin los corchetes se utiliza para liberar la memoria ocupada por un objeto, vg.:
Código PHP:
int *p = new int;
...
delete p;
El operador delete con los corchetes se utiliza para liberar la memoria ocupada por un arreglo de objetos, vg.:
Código PHP:
int *v = new int[5];
...
delete [] v;
En un arreglo de arreglos, primero se liberan los elementos del segundo arreglo y por último el primero.
Código PHP:
...
for(int r=0; r < row; r++) delete [] matriz[r];
delete [] matriz;
El segundo código de tu mensaje no es correcto, no le indicas al compilador que "matriz" se trata de un arreglo, lo tratas como un si fuera un solo objeto, nada garantiza que estes liberando correctamente la memoria.
El caso erroneo inverso sería:
Código PHP:
int *p = new int;
...
delete [] p; // Error, p no es un arreglo
Saludos
