[Solucionado] Liberar memoria de 2 punteros apuntando a la misma dirección(C)

Iniciado por NOB2014, 3 Mayo 2016, 21:43 PM

0 Miembros y 1 Visitante están viendo este tema.

NOB2014

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;
string1 = (char*) malloc(16);
strcpy(string1, "0123456789AB");

string2 = realloc(string1, 8);
printf("string1 Valor: %p [%s]\n", string1, string1);
printf("string2 Valor: %p [%s]\n", string2, string2);


free(string1);
free(string2);

return 0;
}


Bueno es todo, espero aclaración.
Un abrazo.
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

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.

AlbertoBSD

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
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

geeke

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

NOB2014

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

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]
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

geeke

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

NOB2014

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

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:

if ((unsigned long)(oldsize) >= (unsigned long)(nb)) {
    /* already big enough; split below */
    newp = oldp;
    newsize = oldsize;
}

else {
...
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

Eternal Idol

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

Citarvoid* 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.

Cita de: AlbertoBSD en  4 Mayo 2016, 02:51 AMAcabo 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.
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