[C con Clase] Dudas sobre punteros que apuntan a punteros

amauri d b_duhart en live.com.mx
Mie Ene 23 01:45:07 CET 2013


¡Hola Javier! 
Ayudándote con tu duda al final del mensaje, antes de terminar el programa, debes liberar la memoria dinámica para cada objeto creado con el operador new.
Primero, creamos un array de diez punteros y lo almacenamos en la memoria del montón, luego reservamos más memoria, esta vez para cada array de float al que apuntarán los punteros.
Así que si sólo escribimos "delete [] f; " estarías liberando la memoria asignada al array de punteros a float, pero no liberarías la memoria de cada array de float, por lo que quedarían almacenados 10 array de float a los que ya no es fácil acceder (imposible, de hecho, si entiendo bien cómo funciona esto).
Por eso debes eliminar cada objeto creado con new. 
B.Amauri. 

> To: cconclase en listas.conclase.net
> From: javiersalvadormarco en gmail.com
> Date: Tue, 22 Jan 2013 21:52:10 +0100
> Subject: [C con Clase] Dudas sobre punteros que apuntan a punteros
> 
> Buenas noches chicos,
> 
> Este es mi primer mensaje en esta maravilla de comunidad que nos ayuda a perfeccionar nuestras habilidades en el mundo de la programación, así que antes de nada, ¡muchas gracias por todo!
> 
> Ahora voy al grano y os expongo mi pregunta, que va relacionada con lo que más me cuesta de entender en el mundo de la programación: los punteros.
> 
> Parece que después de mucho machacar el tema he conseguido entender de forma más o menos fiable los punteros que apuntan a funciones u objetos, pero cuando hablamos de punteros que apuntan a punteros o arrays la cosa se me atraganta. Este es el ejemplo que tenéis puesto en la web, en el apartado Operadores II -> Operador Delete
> 
> 
> int main() { 
>    char *c; 
>    int *i = NULL; 
>    float **f;  (1)
>    int n;
>  
>    // Cadena de 122 más el nulo:
>    c = new char[123];
>    // Array de 10 punteros a float:
>    f = new float *[10]; (2)
>    // Cada elemento del array es un array de 10 float 
>    for(n = 0; n < 10; n++) f[n] = new float[10]; (3)
>    // f es un array de 10*10 
>    f[0][0] = 10.32; 
>    f[9][9] = 21.39; 
>    c[0] = 'a'; 
>    c[1] = 0; 
>    // liberar memoria dinámica
>    for(n = 0; n < 10; n++) delete[] f[n]; (4)
>    delete[] f; (5)
>    delete[] c; 
>    delete i; 
>    return 0; 
> }
> 
> Entiendo que lo que os he marcado como 1 es la inicialización de un puntero, el f, que va a apuntar a la dirección de memoria de otro puntero, el cual todavía falta por crear.
> 
> En la parte marcada como 2, reservamos 10 posiciones de memoria a las que apuntará f, habiendo en cada una de ellas un puntero. Si no estoy equivocado, f en este momento podrá recoger el valor de cada uno de los punteros que hay, pudiendo moverse a través de sus direcciones de memoria para obtener su valor: Ejemplo f[0] recogerá el valor que apunte el puntero de la array 0. ¿Es así? 
> 
> Aquí me gustaría hacer una pregunta sobre el tema, y es por qué no se utilizaría para extraer el valor real el parámetro *f[0] si lo que queremos es obtener un valor y no una dirección de memoria. Esto me cuesta un poco de ver, ya que con los punteros que apuntan a objetos se hace de esa forma y con arrays he visto que no.
> 
> Pasamos a la parte marcada como 3. Si esto lo entiendo bien, en este momento vamos creando en cada una de las 10 aposiciones en las que teníamos un puntero, un array de 10 floats. Para acceder a estas posiciones bastará con poner por ejemplo: f[3][3], donde el primer corchete desplazaría el puntero que hemos creado en el punto 1, y el segundo corchete los que hemos creado en el 2. ¿Es correcto?
> 
> Parte 4. Aquí mi duda radica en el porqué hemos de crear un bucle para liberar todas las posiciones de memoria, si después realizamos la operación 5:  delete[] f. Supongo que esto es un fallo de concepto mío a la hora de entender la reserva de memoria, ya que yo me imaginaba que al hacer    f = new float *[10] reservamos una cantidad de memoria, y después al hacer el bucle   for(n = 0; n < 10; n++) f[n] = new float[10] fragmentábamos parte de esa memoria para asignarla a cada una de las nuevas arrays de floats. Supongo que he mezclado churros con melindras y que cada vez que se utiliza el new se reserva memoria distinta.
> 
> Muchísimas gracias por vuestra ayuda chicos. Soy programador de PL/SQL y el mundo orientado a objetos me gusta, pero también me vuelve loco.
> 
> ¡Un saludo!
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
 		 	   		  
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20130122/b8b51152/attachment.html>


Más información sobre la lista de distribución Cconclase