2012-06-13 12 views
11

he creado una matriz 2-D utilizando puntero doble de esa manera:libre de un doble puntero

int** pt; pt = (int*) malloc(sizeof(int)*10); 

sé que un puntero se libera de esa manera

free(ptr); 

¿Cómo podemos liberar el doble puntero ?

¿Qué sucede si imprimimos algo y luego liberamos esa memoria y salimos del programa? ¿La memoria final consiste en la que usamos o será la misma que la inicial?

+3

Eso depende de cómo haya llamado 'malloc'. ¿Dónde está el código? –

+1

Es necesario que nos muestre el código. –

+0

@bledi Entonces necesita iterar a través de estos punteros y liberar primero los datos apuntados. Luego libera los punteros. Mire la respuesta de Atila. –

Respuesta

27

Digamos que tiene una matriz mat

int** mat = malloc(10 * sizeof(int*)); 
for (int i=0; i<10; ++i) { 
    mat[i] = malloc(10 * sizeof(int)); 
} 

continuación, puede liberar cada fila de la matriz (suponiendo que haya inicializado cada correctamente de antemano):

for (int i=0; i<10; ++i) { 
    free(mat[i]); 
} 

entonces libre el puntero de alto nivel :

free(mat); 

Para su segunda pregunta: si asigna memoria y utilízalo, cambiarás esa memoria, que no se "revertirá" incluso si la liberas (aunque ya no podrás acceder a ella de manera fiable/portátil).

Nota: el malloc de nivel superior se usa como sizeof(int*) se están asignando puntero-a-int s, no int s - el tamaño de int* y int no se garantiza que sea la misma.

+0

gracias por la respuesta. – bledi

+0

Gracias salvavidas, para esta confirmación – Diljeet

2

Si su matriz no es "desigual", es decir, todas las filas tienen la misma longitud, es posible que desee considerar:

  1. Acceso de forma manual, es decir, justo tratarlo como una matriz de 1D de los valores, y mantener un valor de width por separado. Para acceder a un elemento en (x, y) use mat[y * width + x].
  2. Si realmente desea la conveniencia de mat[y][x], se puede mejorar haciendo una sola llamada a malloc() que asigna tanto la matriz de punteros y todas las filas, a continuación, la inicialización de los punteros para señalar en cada fila. Esto tiene la ventaja de que puede ser gratis: ed con una sola llamada free(mat);.

El segundo enfoque sería algo como esto:

double ** matrix_new(size_t width, size_t height) 
{ 
    double **p = malloc(height * sizeof *p + width * height); 
    double *e1 = (double *) (p + height); 
    size_t i; 

    for(i = 0; i < height; ++i) 
    p[i] = e1 + i * width; 
    return p; 
} 

Nota: lo anterior es probado por la ONU, y el código de producción, obviamente, debe comprobar si hay fallos antes de usar p.

+2

si libera solo el puntero de nivel superior, no se hace referencia a los almacenamientos intermedios apuntados por el nivel interno, ¿son liberados por defecto por algún recolector de basura ????. o deberían ser explícitamente liberados ??? –

Cuestiones relacionadas