Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: bonmario - Settembre 17, 2020, 09:26:18 am

Titolo: [RISOLTO]Possibile memory leak?
Inserito da: bonmario - Settembre 17, 2020, 09:26:18 am
Ciao,
ho dichiarato questa struttura:
Codice: [Seleziona]
  TDatiGenPortlet=Record
    AltForm:Integer;
    LarghForm:Integer;
    StrCode:String;
    DatiJsonDef:TJSONData;
  end;

TJSONData, è un oggetto dichiarato nella unit fpjson.

Il mio dubbio è questo: se dichiaro una variabile di tipo TDatiGenPortlet, quando ho finito di usarla, devo fare qualcosa di particolare per evitare memory leak dovuti a DatiJsonDef??

Grazie, Mario
Titolo: Re:Possibile memory leak?
Inserito da: xinyiman - Settembre 17, 2020, 12:15:09 pm
Più che Record dovresti usare la sintassi class e poi nel distruttore della classe fai fare DatiJsonDef.Free;
Titolo: Re:Possibile memory leak?
Inserito da: bonmario - Settembre 17, 2020, 06:07:35 pm
Sto adattando un vecchio programma, e visto che c'è già una unit che legge i files JSon, stavo usando quella.
Con le classi, sono capace, più che altro, mi chiedevo se c'era qualcosa di simile anche per i record, perché se esistesse, il mio lavoro sarebbe semplice. In caso contrario, mi toccherebbe modificare parecchio codice, per gestire il tutto con una classe e non con un record.

Grazie, Mario
Titolo: Re:Possibile memory leak?
Inserito da: xinyiman - Settembre 18, 2020, 11:13:36 am
In tutta onestà non ho mai usato i record così. Hai già provato a ficcarci un costruttore e un distruttore e vedere se compila? Se si, metti un brackpoint e guarda se passa dal distruttore prima o poi.
Titolo: [RISOLTO]Possibile memory leak?
Inserito da: bonmario - Settembre 18, 2020, 11:29:20 am
In tutta onestà non ho mai usato i record così. Hai già provato a ficcarci un costruttore e un distruttore e vedere se compila? Se si, metti un brackpoint e guarda se passa dal distruttore prima o poi.
Quando ho imparato il Pascal, nel millennio scorso, le classi non esistevano ancora, ed ho imparato ad usare i record.
Poi, come accade spesso, quando per anni usi qualcosa che funziona, abbandonarlo per altro, non è sempre semplice !!!


Ci avevo provato, ma non compilava ...

Oggi mi sono deciso, e sto facendo la modifica. Non la sto facendo "come si deve", ma comunque funzionante.
Praticamente ho modificato la dichiarazione così
Codice: [Seleziona]
 TDatiPortletClass = class(TObject)
 public
   NomeSrc:String;
   AltForm:Integer;
   LarghForm:Integer;
   StrCode:String;
   DatiJsonDef:TJSONData;
 public
   constructor Create;
   destructor Destroy; override;
 end;

Fatto così, le modifiche da fare al codice sono veramente minime, e nella destroy posso ora specificare la Free di DatiJsonDef, togliendomi il problema per cui avevo aperto questo thread

Quando poi avrò tempo, sistemerò la classe, usando le proprietà e non le semplici variabili.

Ciao, Mario
Titolo: Re:[RISOLTO]Possibile memory leak?
Inserito da: nomorelogic - Settembre 18, 2020, 05:12:42 pm
per i record non devi liberare la memoria in quanto sono allocati nello stack
gli oggetti (istanze di classi) sono invece allocati nello heap e devi liberare le risorse
Titolo: Re:[RISOLTO]Possibile memory leak?
Inserito da: bonmario - Settembre 18, 2020, 05:15:29 pm
per i record non devi liberare la memoria in quanto sono allocati nello stack
gli oggetti (istanze di classi) sono invece allocati nello heap e devi liberare le risorse

Solo per curiosità, visto che oramai ho già modificato il programma: nel mio caso "misto", in cui avevo un record che, tra i vari campi ne aveva uno che era un oggetto, avrei dovuto liberare io a mano le risorse quando non mi serviva più, giusto?

Ciao, Mario
Titolo: Re:[RISOLTO]Possibile memory leak?
Inserito da: nomorelogic - Settembre 18, 2020, 05:21:52 pm
si, il riferimento ad una istanza deve essere liberato manualmente
forse potresti valutare se sostituire il TJSONData con una stringa che contiene il json


ci sono poi gli advanced record
http://www.lazaruspascal.it/index.php?page=145
http://www.lazaruspascal.it/index.php?page=151

potresti definire una procedure che istanzia l'oggetto TJSONData, lo usa e poi lo distrugge
dipende se va bene per il lavoro che devi fare

normalmente usare le classi va più che bene comunque
Titolo: Re:[RISOLTO]Possibile memory leak?
Inserito da: bonmario - Settembre 18, 2020, 05:32:51 pm
Sì, grazie, ormai l'ho riscritto usando una classe al posto del record