operaciones - Lenguaje C: liberación de la memoria de punteros a struct
punteros c++ (4)
Cuando tu lo hagas
node1 = malloc(sizeof(NODE));
tienes algo como
+-------+ +-----------------------------+ | node1 | ---> | memory for a NODE structure | +-------+ +-----------------------------+
Después de la asignación node2 = node1
tienes en cambio esto:
+-------+ | node1 | -/ +-------+ / +-----------------------------+ >-> | memory for a NODE structure | +-------+ / +-----------------------------+ | node2 | -/ +-------+
En otras palabras, tiene dos punteros apuntando a la misma memoria.
Intentar llamar free
utilizando cualquiera de las dos variables de puntero invalidará ambos punteros.
Digamos que he declarado un puntero a una estructura y lo asigno con malloc () usando esta definición
typedef struct node {
int info;
struct node *next;
} NODE;
Luego, en algún lugar del código, le dije dos punteros
NODE *node1, *node2 = NULL;
node1 = malloc(sizeof(NODE));
node2 = node1;
Mi pregunta es, ¿debería usar "free ()" para liberar node2 como lo hacen las personas siempre con node1 vía free (node1) . ¿Cuál es exactamente el efecto de la asignación node2 = node1;
Gracias.
node1
es un puntero, lo que significa que el valor de la misma es la dirección de la memoria virtual de la estructura asignada.
Asignar node2 = node1
simplemente copia esa dirección.
Como resultado, free(node1)
y free(node2)
son equivalentes.
Debería pasar la dirección devuelta por malloc()
y familia a free()
para liberar la memoria asignada.
En su caso, solo está asignando la dirección devuelta a otro puntero y utilizando eso en forma gratuita, lo que está bien.
No deberías hacer
node2 = node1;
node2 = node2 +1;
free(node2);
Entonces puedes usar uno de ellos en tu caso para liberar la memoria
free(node1)
y free(node2)
son iguales en tu caso
No liberas node1
ni node2
. Liberas la memoria que señalan.
Con eso en mente, debería quedar claro por qué solo debería llamar free
una vez