Funcion NEW

Funcion NEW

de Juan Sebastian Korenko Crisera -
Número de respuestas: 2
NEW (a) lo puedo hacer en cualquier momento del codigo?
No importa si a ya tiene una region de memoria a donde apunta, si apunta a NIL o si aun no a sido invocado??
Muchas Gracias
En respuesta a Juan Sebastian Korenko Crisera

Re: Funcion NEW

de Romina Diana Romero Riva -
Como poder, podés. Pero si a ya tiene una región de memoria y hacés un NEW(a) estás perdiendo la referencia a esa región de memoria (dejándola colgada) y pediendo más memoria (si esto se hiciera un gran número de veces el programa se podría colgar por habérsele acabado la memoria dinámica disponible). Esto no es bueno y no se va a calificar muy bien.
Podés por ejemplo apuntar con un puntero auxiliar a lo que apunta a, luego pedir memoria nueva para a, y según lo que quieras hacer con la memoria vieja proseguís.

aux:= a;
NEW(a);
...

Ahora, si lo que hay en a ya no te interesa, directamente cargás el valor nuevo en la memoria que a ya tiene:
a^ := loQueQuieras;

Si a era NIL, no hay ningún problema en hacer NEW(a), ya que este puntero no apunta a ninguna dirección de memoria (no está utilizando nada de la memoria dinámica).

Tampoco es bueno hacer algo así:
NEW(a);
a^ := algo;
... (* No se realiza "DISPOSE(a)" *)
a := NIL;
...

Ya que en este caso (aunque no le cargues ningún valor a a (es decir, el mismo código sin la segunda línea)) estás también perdiendo la memoria que pediste para a (se dice que está siendo desreferenciada) dejándola colgada. Lo correcto sería realizar un DISPOSE(a) previamente a asignarle el valor NIL para liberar la memoria.

Si a no fue llamada previamente, podés perfectamente realizar NEW(a).


Cualquier duda preguntá de vuelta.

Saludos.