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
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.
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.
Muchas gracias por la aclaracion mi duda era mas que nada cuando la memoria apuntaba a NIL, Suerte