Newsgroup: it.comp.lang.delphi
Titolo: Vuoto di memoria: come facevo a vedere se un oggetto era valido?

Scusate ma non ricordo come facevo a vedere se un oggetto e' valido o
meno.
nil non vale xche se e' stato creato e po distrutto la variabile non
e' unguale a nil.
Mi spiego meglio.
Ho una finestra che deve essere creata alla quale devo fare delle cose
se esiste. Ma se l'utente clicca su chiudi non devo updarla+ (anche
xche se nell'evento on close metto free ottengo un bell'access
violation)
Per ora uso una var boolean. ma c'e' un modo x sapere se l'oggetto
esiste o meno?
io avevo pensato qualcosa del genere:
//+++++++++++++++++++++++++++++++++++++++++++++++++
function isvalidobject(obj:tobject):boolean;
begin
try
  result:= 
obj.name
 <> '';
except
  Result:=false;
end;
end;
//+++++++++++++++++++++++++++++++++++++++++++++++++
Salutoni
Kirys
-- 
.     _  _______  ļ,ø*°`°*ø,ļ_ļ,ø*°`°*ø,ļ_ļ,ø*°`°*ø,ļ_ļ,ø*°`°*ø,ļ_
  /| // /__  __/  Kirys <Remove DELTHIS from the address to reply>
 / |/ \   / /     Kirys Tech 2000: 
http://www.kt2k.com
/__|\__\ /_/ 2000 ļ,ø*°`°*ø,ļ_ļ,ø*°`°*ø,ļ_ļ,ø*°`°*ø,ļ_ļ,ø*°`°*ø,ļ_

 Kirys
Ciao, Antò.

 meno.
Non puoi.
--------------------------------
Inviato via 
http://usenet.libero.it


Scusa puoi chiarire?
Anche io pensavo si potesse usare il classico "if assign(oggetto) then..."
ma in base alla tua risposta e alla tua autorevolezza (sono uno dei tanti
lurker ;-)) ora sono incuriosito...
Cioa
Morde


 end;
Dovrebbe funzionare se il destructor dell'oggetto mette Name := '' (non
e' detto). Inoltre, non funziona per istanze di classi che non hanno la
proprieta' Name.
Saluti
Paolo Arosio

lurker ;-)) ora sono incuriosito...
Assign verifica semplicemente che il reference delll'oggetto non sia
impostato su NULL... basterebbe dargli un qualunque indirizzo di
memoria x saltare Assign... purtroppo non esiste nulla nel gestore di
memoria del sistema operativo che verifichi se un'area di memoria e'
allocata correttamente...

 Scusa puoi chiarire?
E' un annoso problema legato ai puntatori (le istanze delle classi sono, in
Delphi, dei puntatori all'oggetto vero e proprio). Non puoi sapere, a
priori, se la memoria puntata da un puntatore corrisponda a qualcosa di
"valido", innanzitutto perche' il sistema non tiene traccia di un
riferimento del genere (non puo' e non deve) e poi perche' bisogna chiarire
che si intende per "valido". La validita' o meno della memoria puntata da un
puntatore e' valutabile solo dall'uomo, non dal sistema. Io potrei allocare
con successo della memoria per un puntatore (= e quindi per me questa
memoria e' "valida"), poi lo dealloco (= per me la memoria puntata dal
puntatore, ora, non e' piu' "valida"), poi assegno al puntatore l'indirizzo
di un oggetto che e' gia' presente in memoria (= non ho allocato memoria per
il puntatore, ma la memoria puntata e' nuovamente "valida", per me).
Come vedi, la valutazione di "valido" o meno dipende esclusivamente dal
programmatore.
In Delphi, in particolare, Assigned() non viene in aiuto, in quanto si
limita a verificare che il puntatore non sia nil. Il problema e' quando non
e' nil.



A questo punto, credo che la validita' di un oggetto in memoria sia un
problema che affligge tutti i linguaggi "object oriented", e non solo
deplhi.
Cioe', per spiegarmi meglio: se alloco un puntatore con la create, e poi
faccio un assign su di esso, effettivamente so solo se il puntatore non e'
null (o NIL). Ma della validita' della memoria puntata da esso non posso
compiere verifiche se non scrivendo delle particolari routine che
controllino la memoria stessa, in relazione all'oggetto a cui fa
riferimento.
Mi ricordo infatti che quando ho imparato a programmare in c++ il primo
comandamento che mi hanno insegnato era "ogni new che fai deve avere la
delete". Pero', in c++ la memoria la gestiva il programmatore, mentre in
delphi mi sembra che, volendo, si possa scrivere un programma senza doversi
interessare della memoria che occupa, e come la dealloca.
Ovviamente il tutto sempre in via teorica.
Ciao


 interessare della memoria che occupa, e come la dealloca.
Il contrario. In C++ gli oggetti possono essere allocati staticamente, cosa
che in Delphi non puoi fare (esiste solo allocazione dinamica per le istanze
delle classi). Se allochi dinamicamente, ti devi preoccupare di deallocare
esplicitamente, sia in C++ che in Delphi.


"Paolo Arosio"

Temo di aver detto almeno una stupidata. (Dovrebbe funzionare...)
Saluti
Paolo Arosio