Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: petrusic - Ottobre 02, 2022, 04:19:53 pm

Titolo: Come liberare la memoria occupata da variabili globali nascoste
Inserito da: petrusic - Ottobre 02, 2022, 04:19:53 pm
In una Form modale, avrei bisogno di rilasciare, al momento della "close" di detta Form, l'area di memoria impegnata da alcune variabili dichiarate all'interno della sezione d'implementazione:
Codice: [Seleziona]
[ . . . ]
implementation
type
[ . . . ]
  TtbCtiMoviUlt = array of array of AnsiString;
  TtbCtiMoviVec = array of array of AnsiString;

var
[ . . . ]
  tbCtiMoviUlt: TtbCtiMoviUlt;
  tbCtiMoviVec: TtbCtiMoviVec;     
[ . . . ]
 
Ciò è dovuto al fatto  che la chiamata della suddetta Form(modale) può essere ripetuta, quindi avrei bisogno di dichiarare e ricaricare ogni volta tali variabili.

 Avevo pensato di risolvere praticamente (quindi senza liberare memoria) con:
Codice: [Seleziona]
 SetLength(tbCtiMoviUlt, 0);
 SetLength(tbCtiMoviVec, 0);   
Ma ho scoperto miseramente che il loro contenuto rimane inalterato. Allora a questo punto non mi resta che imparare a fare le cose per bene.

Quindi sono alla ricerca di una soluzione.
Titolo: Re:Come liberare la memoria occupata da variabili globali nascoste
Inserito da: DragoRosso - Ottobre 02, 2022, 10:27:44 pm
Ciò che fai è corretto. Gli array vengono "distrutti".

Se vedi "qualcosa" vuole dire che il SetLength (..., 0) non è stato eseguito o hai problemi con il debugger (già discussi in altri post).

Ciao
Titolo: Re:Come liberare la memoria occupata da variabili globali nascoste
Inserito da: Stilgar - Ottobre 04, 2022, 12:19:04 pm
O semplicemente la memoria deallocata non è stata sovrascritta.
Stilgar
Titolo: Re:Come liberare la memoria occupata da variabili globali nascoste
Inserito da: DragoRosso - Ottobre 04, 2022, 12:53:43 pm
O semplicemente la memoria deallocata non è stata sovrascritta.
Stilgar

Il SetLength quando ALLOCA l'array azzera la memoria. Non è possibile quindi ritrovarsi l'array "sporco".
Inoltre il SetLength(..,0) pone a nil il puntatore (liberando correttamente l'allocazione di memoria) e quindi il vecchio contenuto non è accessibile. Se però il debugger, per qualche motivo (tipo ottimizzazione), mantiene il puntatore dell'array in cache .... allora vedresti "erroneamente" il contenuto.

Ciò che ritengo più probabile è che il SetLegth(.., 0) non venga eseguito.

Ciao
Titolo: Re:Come liberare la memoria occupata da variabili globali nascoste
Inserito da: SB - Ottobre 05, 2022, 02:54:07 pm
Suggerirei, in caso di dubbi sulla errata deallocazione di memoria, di vedere se può essere di aiuto l'utilizzo della unit heaptrc (vedere opzioni progetto debugging)
Al termine dell'esecuzione dovrebbe segnalare eventuali problemi
Titolo: Re:Come liberare la memoria occupata da variabili globali nascoste
Inserito da: nomorelogic - Ottobre 05, 2022, 05:02:53 pm
Usare heaptrc mi pare la cosa migliore per sapere cosa capita alla memoria.

Se poi ho capito bene: si tratta di una form modale dove alla creazione si allocano le variabili e, alla fine, si deallocano. Probabilmente queste variabili dovrebbero essere dichiarate nella form e gestire in OnCreate e OnDestroy.
Titolo: Re:Come liberare la memoria occupata da variabili globali nascoste
Inserito da: DragoRosso - Ottobre 08, 2022, 10:11:22 pm
Usare heaptrc mi pare la cosa migliore per sapere cosa capita alla memoria.

Se poi ho capito bene: si tratta di una form modale dove alla creazione si allocano le variabili e, alla fine, si deallocano. Probabilmente queste variabili dovrebbero essere dichiarate nella form e gestire in OnCreate e OnDestroy.

In realtà, io ho capito che @petrusic vuole gestire quelle variabili nell'esecuzione della Form Modale.

Una Form Modale, come impostazione predefinita, non viene distrutta quando viene chiusa ma solo nascosta.

Quindi forse la cosa migliore è gestirle negli eventi OnShow e OnHide, fermo restando che non chiami qualche funzione della Form Modale durante la fase di Hide.

In realtà se nell'evento OnShow usa come prime istruzioni il SetLength(...,0) non ci sarebbe la necessità di gestirle nel metodo OnHide.

Nel OnDestroy vanno comunque deallocate.

Ciao.