Autor
|
Tema: [Solucionado] Liberar memoria de 2 punteros apuntando a la misma dirección(C) (Leído 6,480 veces)
|
NOB2014
Desconectado
Mensajes: 366
|
Hola, gente. - ¿Es necesario liberar los 2 punteros por separado?, como lo hago en el código que dejo a continuación o es suficiente con liberar el puntero que devuelve malloc (tengo claro que malloc retorna un puntero void). - #include <stdio.h> #include <stdlib.h> #include <string.h> int main( void ){ char *string1, *string2; strcpy(string1 , "0123456789AB"); printf("string1 Valor: %p [%s]\n", string1 , string1 ); printf("string2 Valor: %p [%s]\n", string2 , string2 ); return 0; }
Bueno es todo, espero aclaración. Un abrazo.
|
|
« Última modificación: 4 Mayo 2016, 15:22 pm por NOB2014 »
|
En línea
|
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
|
|
|
MAFUS
Desconectado
Mensajes: 1.603
|
En este caso, cuándo haces realloc, string1 deja de tener memoria asignada. Hay que verlo como si realloc hiciera internamente un free al puntero que se le pasa. El que veas string1 después del realloc es porqué los datos persisten en la memoria (no se pone a 0), aunque hay que recordar que el sistema ya no la tiene en cuenta por tanto en cualquier momento se puede reescribir.
|
|
|
En línea
|
|
|
|
AlbertoBSD
Programador y
Moderador Global
Desconectado
Mensajes: 3.705
🏴 Libertad!!!!!
|
Como comenta MAFUS el string1 deja de tener memoria asignada... aun asi el string1 sigue apuntando a la direccion que originalmente se le asigno y los datos que estaban ahi ahi siguen... el sistema operativo es el que se encarga de ver si lo borra lo asigna o que se yo.. Es deber del usuario no usar ese puntero hasta que se reasigne nuevamente. La memoria que originalmente se asigno podria ser designada a otro apuntador. Si el apuntador se va a volve a usar hay que igualarlo a NULL para que no nos de un error despues al hacer if(string1).... mas info: http://linux.die.net/man/3/realloc
|
|
|
En línea
|
|
|
|
geeke
Desconectado
Mensajes: 93
|
También notar que al llamar a realloc se reasigna un espacio de memoria menor al requerido por la cadena original esto causa un comportamiento indefinido
|
|
|
En línea
|
|
|
|
NOB2014
Desconectado
Mensajes: 366
|
Muchas gracias a los 3 por ocuparse, si entendí bien con hacer free(string2) es suficiente. - Al releer el tema en un momento dice que si string2 es menor a string1 el administrador del montón tratara de utilizar la misma dirección de memoria y como pude comprobar con este programa la dirección de string1 es la misma que string2, ¿esto es correcto? o interprete mal. - Geeke, lo tuyo es lo único que no me queda claro. -
Saludos.
|
|
|
En línea
|
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
|
|
|
AlbertoBSD
Programador y
Moderador Global
Desconectado
Mensajes: 3.705
🏴 Libertad!!!!!
|
Si es la misma, depende de la implementan de realloc, en teoria lo mas eficiente es dejar la misma dirección cuando el espacio que se va asignar es menor al previo. string1 Valor: 0000000000321380 [0123456789AB] string2 Valor: 0000000000321380 [0123456789AB]
|
|
|
En línea
|
|
|
|
geeke
Desconectado
Mensajes: 93
|
Me refiero a que la cadena 0123456789AB tiene mas de 8 caracteres tu reasignas espacio solo para ocho; recuerda que realloc copia todo el contenido del antiguo puntero al nuevo
|
|
|
En línea
|
|
|
|
NOB2014
Desconectado
Mensajes: 366
|
En definitiva, lo que pregunte parecería que tendría una respuesta obvia, solo que quería estar más seguro teniendo la palabras de Uds. los expertos.- AlbertoBSD, gracias nuevamente.
Un abrazo.
|
|
|
En línea
|
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
|
|
|
AlbertoBSD
Programador y
Moderador Global
Desconectado
Mensajes: 3.705
🏴 Libertad!!!!!
|
Acabo de confirmar al revisar el codigo fuente derealloc y si el espacio de memoria solicitado es menor que el anterior NO mueve ningun byte de memoria, solo actualiza en su lista de punteros que el puntero dado utiliza menos memoria. Lo pueden revisar en http://www.scs.stanford.edu/histar/src/pkg/uclibc/libc/stdlib/malloc-standard/realloc.cLa parte en cuestion es esta: if ((unsigned long)(oldsize) >= (unsigned long)(nb)) { /* already big enough; split below */ newp = oldp; newsize = oldsize; } else { ...
|
|
|
En línea
|
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.966
Israel nunca torturó niños, ni lo volverá a hacer.
|
http://www.cplusplus.com/reference/cstdlib/realloc/void* realloc (void* ptr, size_t size);
Reallocate memory block Changes the size of the memory block pointed to by ptr.
The function may move the memory block to a new location (whose address is returned by the function). La palabra clave ahi es may, no siempre se mueve el bloque de memoria. Acabo de confirmar al revisar el codigo fuente derealloc Una aclaracion: ese es un codigo fuente, lo que vale es lo que dice el standard, todo lo demas son implementaciones.
|
|
|
En línea
|
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
[pregunta]es posible que teniendo la misma ip este apuntando a otro host?
Redes
|
daryo
|
2
|
2,406
|
3 Mayo 2013, 01:26 am
por daryo
|
|
|
[SOLUCIONADO] Acceso a dirección de memoria con pointers en varios niveles
Programación C/C++
|
panax
|
9
|
4,269
|
6 Mayo 2014, 17:00 pm
por Mad Antrax
|
|
|
Matriz de punteros, duda al liberar memoria[C]
Programación C/C++
|
NOB2014
|
2
|
2,839
|
9 Junio 2016, 03:04 am
por NOB2014
|
|
|
matriz de punteros de una dimensión - liberar memoria[C]
Programación C/C++
|
NOB2014
|
3
|
2,368
|
11 Junio 2016, 02:35 am
por AlbertoBSD
|
|
|
Punteros concatenados. Como guardar una direccion de memoria?
Programación C/C++
|
AXA
|
5
|
5,123
|
23 Octubre 2021, 08:06 am
por Eternal Idol
|
|