Pascal/Turbo Pascal - Punteros

 
Vista:
sin imagen de perfil

Punteros

Publicado por thenine (6 intervenciones) el 20/04/2007 11:32:47
Hola a todos,

tengo el siguiente código y al hacer un dispose() de un puntero lo elimina de memoria,

Si es así por que si hago el writeln() en la última linea me escribe el valor que tiene,

despues de haber echo el dispose() no lo ha liberado y con lo cual debería desaparecer???

me podeís ayudar a entnderlo

Salu2

Type
TRegistro=RECORD
articulo:String;
precio:integer;
END;
TPRegistro=^TRegistro;

var
dato:integer;
ref1,ref2,ref3:TPRegistro;
begin
new(ref1);
new(ref2);
new(ref3);
ref1^.articulo:='pan';
ref1^.precio:=50;
ref2^.articulo:='leche';
readln(ref2^.precio);
ref3^.articulo:=ref1^.articulo + ',' + ref2^.articulo;

ref3^.precio:=ref1^.precio+ref2^.precio;
writeln(ref3^.articulo,' ',ref3^.precio);

dispose(ref1);
writeln(ref1^.precio);

end
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Punteros

Publicado por Diego Romero (996 intervenciones) el 20/04/2007 12:47:34
De dónde has sacado la curiosa idea de que Dispose() "desaparece" punteros es algo que no sé. Dispose() solo indica al SO que esa posición de memoria ya no está siendo usada. Desde el punto de vista de tu programa esa posición de memoria no es fiable.
En el ejemplo que posteaste funciona porque todavía la posición apuntada por ref1 no fue sobreescrita por otra cosa.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:Punteros

Publicado por thenine (6 intervenciones) el 20/04/2007 13:19:26
Es decir que para liberar la memoria primero se tendrá que eliminar el contenido de esa posición y luego haccer el dispose???
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Punteros

Publicado por Diego Romero (996 intervenciones) el 20/04/2007 16:12:16
No. No es necesario.

A ver si me explico bien.

Cuando haces New() de un puntero, éste procedimiento le dice al SO (Sistema Operativo) que reserve un espacio de memoria, esto quiere decir que solo y únicamente ese espacio de memora podrá ser accedido por ese puntero. Esto previene que cualquier otra variable sobreescriba esa región.

Dispose() hace lo contrario, le dice al SO que puede disponer de ese espacio de memoria como lo crea conveniente, pero esto no significa que el puntero deje de existir o que el contenido de ese espacio de memoria apuntado por el puntero desaparezca. Por el contrario sigue estando allí, solo que desde el punto de vista del programa esa región ya no es segura, el SO no le puede asegurar al programa que solo él y únicamente él puede escribir en esa región.

Ahora bien ¿por qué hay que usar Dispose() luego de un New()?, porque si comienzas a usar indiscriminadamente New() el SO estará marcando como reservado a tu programa mucha memoria que luego nunca es liberada, corriendo el riesgo de que agotes la memoria.

En un entorno monotarea como el MS-DOS esto no parece muy importante, pero en un entorno multitarea como Windows 32 es fundamental. Sin embargo MS-DOS sí trabaja con memoria dinámica, por ejemplo, cada vez que invocas a un procedimiento o función el SO copia el código ejecutable de ese proc. o función a una región de memoria que esté libre, lo ejecuta y al finalizar libera esa memoria.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:Punteros

Publicado por thenine (6 intervenciones) el 21/04/2007 11:40:52
OK muchas gracias por toda la aclaración

Salu2
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar