Ho visto un sacco di codice come il seguente esempio. È in Python, ma lo stesso errore è stato fatto in tutte le lingue con risorse gestite:
f = open('foo.txt', 'rb')
for line in f: print line
Questo è tutto. L'errore è che close(f)
non è stato chiamato in modo tale che l'handle del file sia mantenuto aperto fino a un certo tempo indeterministico in futuro quando la gestione della memoria runtime decide di recuperare la memoria.
Python ha with
e c # ha using
per semplificare la pulizia delle risorse, ma ignoriamo queste funzionalità per un minuto. Dato che:
- È un errore di programmazione non chiudere esplicitamente i file aperti.
- Il runtime può rilevare che un file aperto non è stato chiuso.
Perché allora il runtime non genera un errore invece di essere "utile" e chiude il file per il programmatore? Quello sarebbe il fallimento veloce e fallire presto la strategia. C'è una ragione tecnica per cui non può? C'è qualche lingua che lo fa? L'idea è stata presa in considerazione prima (ho cercato su google ma non ho trovato nulla)?
Ecco come quasi implementa la funzione in Python:
class mustclose:
def __init__(self, f):
self.f = f
def __del__(self):
if not self.f.closed:
raise Exception("You forgot to close() me!")
k = mustclose(open('foo.txt', 'wb'))
#k.f.close()
Due problemi: richiede wrapper, a Python non piace lanciare eccezioni dai distruttori.
(Leggi questo link QUINTA domanda per informazioni sul motivo per cui è spesso auspicabile un errore veloce)