Se il ciclo lo fai così stai perdendo memoria perchè metti a NULL anche i precendenti puntatori che invece dovresti deallocare e poi liberare. Il problema è che non mantieni il vecchio numero di righe, dovresti ternertelo e fare il ciclo così:
codice:
for (i=old_righe; i<righe; i++){
	mat[i] = NULL;
}
Poi per il problema della deallocazione credo che il ciclo dovrebbe essere fatto sul numero di righe e non di colonne.
codice:
	//dealloco matrice
	for(i=0; i<righe; i++){
		free(mat[i]);
	}
	free(mat);