Te incluyo un programa de ejemplo, hecho con Codeblocks versión 16.01 y MinGW 4.9.2 (32 bits)
Las funciones pedir_memoria_1() y borrar_memoria_1(), que utilizan directamente el puntero, me provocan ambas un error de segmentación.
Las funciones pedir_memoria_2() y borrar_memoria_2(), que (en teoría) funcionan como las versiones _1, pero utilizando una variable intermedia, me funcionan perfectamente. La función borrar_memoria_2() lo que hace es poner el puntero original a NULL una vez que libera la memoria (ya te comenté por qué hacerlo así).
La función borrar_memoria_3() es la tuya original.
La función matriz_prueba() es para comprobar que la matriz se ha creado correctamente.
¿Por qué funcionan las versiones que usan una variable intermedia y las otras no? Francamente, no lo sé, pero habiendo un modo de que funcione...
Código C++:
Ver original#include <iostream>
using namespace std;
void pedir_dimension (int *f, int *c);
void pedir_memoria_1 (int ***a, int f, int c);
void pedir_memoria_2 (int ***a, int f, int c);
void matriz_prueba (int **a, int f, int c);
void imprimir_matriz (int **a, int f, int c);
void borrar_matriz_1 (int ***a, int f, int c);
void borrar_matriz_2 (int ***a, int f, int c);
void borrar_matriz_3 (int **a, int f, int c);
int main()
{
int fils, cols;
int **A;
pedir_dimension(&fils, &cols);
//pedir_memoria_1(&A, fils, cols);
pedir_memoria_2(&A, fils, cols);
matriz_prueba(A, fils, cols);
imprimir_matriz(A, fils, cols);
//borrar_matriz_1(&A, fils, cols);
borrar_matriz_2(&A, fils, cols);
//borrar_matriz_3(A, fils, cols);
return 0;
}
void pedir_dimension (int *f, int *c)
{
cin >> "Filas: "
cin >> *f;
cin >> "Columnas: ";
cin >> *c;
cout << endl;
}
void pedir_memoria_1 (int ***a, int f, int c)
{
*a = new int*[f];
for (int i=0; i<f; i++)
{
*a[i] = new int[c];
}
}
void pedir_memoria_2 (int ***a, int f, int c)
{
int **b;
b = new int*[f];
for (int i=0; i<f; i++)
{
b[i] = new int[c];
}
*a = b;
}
void matriz_prueba (int **a, int f, int c)
{
for (int i=0; i<f; i++)
for (int j=0; j<c; j++)
a[i][j] = 10*(i+1) + (j+1);
}
void imprimir_matriz (int **a, int f, int c)
{
for (int i=0; i<f; i++)
{
for (int j=0; j<c; j++)
{
cout << a[i][j] << " ";
}
cout << endl;
}
}
void borrar_matriz_1 (int ***a, int f, int c)
{
for (int i=0; i<f; i++)
delete[] *a[i];
delete[] *a;
*a = NULL;
}
void borrar_matriz_2 (int ***a, int f, int c)
{
int **b;
b = *a;
for (int i=0; i<f; i++)
delete[] b[i];
delete[] b;
*a = NULL;
}
void borrar_matriz_3 (int **a, int f, int c)
{
for (int i=0; i<f; i++)
delete[] a[i];
delete[] a;
}
De todos modos, me pica la curiosidad, voy a probar utilizando C puro y duro con malloc() a ver qué pasa. Ya te comentaré.
Saludos,