elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [Solucionado] Liberar memoria de 2 punteros apuntando a la misma dirección(C)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: [Solucionado] Liberar memoria de 2 punteros apuntando a la misma dirección(C)  (Leído 6,480 veces)
NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
[Solucionado] Liberar memoria de 2 punteros apuntando a la misma dirección(C)
« en: 3 Mayo 2016, 21:43 pm »

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). -

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int main( void ){
  6. char *string1, *string2;
  7. string1 = (char*) malloc(16);
  8. strcpy(string1, "0123456789AB");
  9.  
  10. string2 = realloc(string1, 8);
  11. printf("string1 Valor: %p [%s]\n", string1, string1);
  12. printf("string2 Valor: %p [%s]\n", string2, string2);
  13.  
  14.  
  15. free(string1);
  16. free(string2);
  17.  
  18. return 0;
  19. }

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 Desconectado

Mensajes: 1.603



Ver Perfil
Re: Liberar memoria de 2 punteros apuntando a la misma dirección(malloc/realloc/free
« Respuesta #1 en: 3 Mayo 2016, 21:54 pm »

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 Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Liberar memoria de 2 punteros apuntando a la misma dirección(malloc/realloc/free
« Respuesta #2 en: 3 Mayo 2016, 22:55 pm »

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 Desconectado

Mensajes: 93


Ver Perfil
Re: Liberar memoria de 2 punteros apuntando a la misma dirección(malloc/realloc/free
« Respuesta #3 en: 3 Mayo 2016, 22:57 pm »

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 Desconectado

Mensajes: 366



Ver Perfil
Re: Liberar memoria de 2 punteros apuntando a la misma dirección(malloc/realloc/free
« Respuesta #4 en: 3 Mayo 2016, 23:29 pm »

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 Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Liberar memoria de 2 punteros apuntando a la misma dirección(malloc/realloc/free
« Respuesta #5 en: 3 Mayo 2016, 23:37 pm »

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.

Código:
string1 Valor: 0000000000321380 [0123456789AB]
string2 Valor: 0000000000321380 [0123456789AB]
En línea

geeke

Desconectado Desconectado

Mensajes: 93


Ver Perfil
Re: Liberar memoria de 2 punteros apuntando a la misma dirección(malloc/realloc/free
« Respuesta #6 en: 4 Mayo 2016, 00:04 am »

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 Desconectado

Mensajes: 366



Ver Perfil
Re: Liberar memoria de 2 punteros apuntando a la misma dirección(malloc/realloc/free
« Respuesta #7 en: 4 Mayo 2016, 00:28 am »

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 Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Liberar memoria de 2 punteros apuntando a la misma dirección(malloc/realloc/free
« Respuesta #8 en: 4 Mayo 2016, 02:51 am »

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.c

La parte en cuestion es esta:
Código
  1. if ((unsigned long)(oldsize) >= (unsigned long)(nb)) {
  2.    /* already big enough; split below */
  3.    newp = oldp;
  4.    newsize = oldsize;
  5. }
  6.  
  7. else {
  8. ...
  9.  
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.966


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Liberar memoria de 2 punteros apuntando a la misma dirección(malloc/realloc/free
« Respuesta #9 en: 4 Mayo 2016, 03:28 am »

http://www.cplusplus.com/reference/cstdlib/realloc/

Citar
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
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines