2010-06-24 6 views
14

in questo esempioUn array dinamico viene deallocato automaticamente quando esce dall'ambito?

procedure foobar; 
var tab:array of integer; 
begin 
    setlength(tab,10); 
end; 

è la matrice distrutto o la memoria sono perdite?

+0

Anche se potrebbe non perdere, è necessario liberare le proprie variabili. Imposta SetLength (scheda, 0); è una linea in più. Se sei preoccupato, avvolgi tutto in un blocco try/finally. –

+2

Non posso approvare questo consiglio, @Ryan. Cancellate manualmente anche tutte le variabili di stringa? Quando vedo il codice che assegna valori alle variabili che non vengono mai più utilizzate, mi dice che il programmatore non capisce veramente come funziona la lingua. In particolare, il compilatore mette già un blocco try-finally attorno al corpo della funzione per assicurare che la variabile dynamic-array venga pulita. Mettere in uno di voi è eccessivo. –

+0

@Ryan, è sbagliato. La chiamata a SetLength è uno spreco totale, sia di tasti che di una chiamata di funzione non necessaria in fase di esecuzione. Gli array dinamici sono gestiti dal compilatore e verranno liberati automaticamente quando escono dall'ambito. –

risposta

14

La memoria è stata liberata. (Ovvero, nessuna perdita di memoria!)

+4

Gli elementi vengono liberati anche se sono gestiti dal compilatore (array din, stringhe, intf, record con tali tipi e così via). – alex

+1

Per "tab: array of Integer", tutto viene liberato. Per "tab: array of TObject" o qualsiasi altra classe, è necessario liberare gli oggetti da soli. –

+0

Vero, @Warren, ma questo non ha nulla a che fare con l'array. Lo stesso consiglio vale per uno scalare ordinario. Gli oggetti devono essere liberati; gli interi non lo fanno. –

1

La matrice viene automaticamente liberata, ma ho visto casi oscuri dove non è per qualche motivo. L'ho risolto impostando la matrice su zero.

+6

Ci sono solo due ragioni per cui non sarebbe stato liberato. O stai facendo qualcosa di spaventoso con i puntatori che incasinano il conteggio dei riferimenti, o l'array è di proprietà di un oggetto o di un record che sta perdendo. –

+0

Lo so, in qualche modo c'era qualcos'altro che lo faceva non auto-liberare. Vorrei avere ancora l'esempio per dimostrarlo! Ma io no. –

+0

Quello sarebbe un bug nel codice-compilatore del compilatore. O forse era un threadvar? L'aiuto indica chiaramente che il tipo gestito usato come threadvars non si libererà automaticamente ed è necessario farlo manualmente. –

Problemi correlati