* * * *

Privacy Policy

Blog italiano

Clicca qui se vuoi andare al blog italiano su Lazarus e il pascal.

Forum ufficiale

Se non siete riusciti a reperire l'informazione che cercavate nei nostri articoli o sul nostro forum vi consiglio di visitare il
Forum ufficiale di Lazarus in lingua inglese.

Lazarus 1.0

Trascinare un file nel programma
DB concetti fondamentali e ZeosLib
Recuperare codice HTML da pagina web
Mandare mail con Lazarus
Stabilire il sistema operativo
Esempio lista in pascal
File INI
Codice di attivazione
Realizzare programmi multilingua
Lavorare con le directory
Utilizzare Unità esterne
TTreeView
TTreeview e Menu
Generare controlli RUN-TIME
LazReport, PDF ed immagini
Intercettare tasti premuti
Ampliare Lazarus
Lazarus e la crittografia
System Tray con Lazarus
UIB: Unified Interbase
Il file: questo sconosciuto
Conferma di chiusura di un applicazione
Liste e puntatori
Overload di funzioni
Funzioni a parametri variabili
Proprietà
Conversione numerica
TImage su Form e Panel
Indy gestiore server FTP lato Client
PopUpMenu sotto Pulsante (TSpeedButton)
Direttiva $macro
Toolbar
Evidenziare voci TreeView
Visualizzare un file Html esterno
StatusBar - aggirare l'errore variabile duplicata
Da DataSource a Excel
Le permutazioni
Brute force
Indy 10 - Invio email con allegati
La gestione degli errori in Lazarus
Pascal Script
Linux + Zeos + Firebird
Dataset virtuale
Overload di operatori
Lavorare con file in formato JSON con Lazarus
Zeos ... dietro le quinte (prima parte)
Disporre le finestre in un blocco unico (come Delphi)
Aspetto retrò (Cmd Line)
Lazarus 1.0
Come interfacciare periferica twain
Ubuntu - aggiornare free pascal e lazarus
fpcup: installazioni parallele di lazarus e fpc
Free Pascal e Lazarus sul Raspberry Pi
Cifratura: breve guida all'uso dell'algoritmo BlowFish con lazarus e free pascal.
Creare un server multithread
guida all'installazione di fpc trunk da subversion in linux gentoo
Indice
DB concetti fondamentali e connessioni standard
Advanced Record Syntax
DB concetti fondamentali e DBGrid
DB concetti fondamentali e TDBEdit, TDBMemo e TDBText
Advanced Record Syntax: un esempio pratico
Superclasse form base per programmi gestionali (e non)
Superclasse form base per programmi gestionali (e non) #2 - log, exception call stack, application toolbox
Superclasse form base per programmi gestionali (e non) #3 - traduzione delle form
Superclasse form base per programmi gestionali (e non) #4 - wait animation
Un dialog per la connessione al database:TfmSimpleDbConnectionDialog
Installare lazarus su mac osx sierra
immagine docker per lavorare con lazarus e free pascal
TDD o Test-Driven Development
Benvenuto! Effettua l'accesso oppure registrati.
Aprile 17, 2024, 01:13:31 am

Inserisci il nome utente, la password e la durata della sessione.

22 Visitatori, 0 Utenti

Autore Topic: [RISOLTO]Possibile memory leak?  (Letto 1647 volte)

bonmario

  • Hero Member
  • *****
  • Post: 1300
  • Karma: +10/-1
[RISOLTO]Possibile memory leak?
« il: 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
« Ultima modifica: Settembre 18, 2020, 11:29:34 am da bonmario »

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3249
  • Karma: +12/-0
Re:Possibile memory leak?
« Risposta #1 il: 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;
Ieri è passato, domani è futuro, oggi è un dono...

bonmario

  • Hero Member
  • *****
  • Post: 1300
  • Karma: +10/-1
Re:Possibile memory leak?
« Risposta #2 il: 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

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3249
  • Karma: +12/-0
Re:Possibile memory leak?
« Risposta #3 il: 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.
Ieri è passato, domani è futuro, oggi è un dono...

bonmario

  • Hero Member
  • *****
  • Post: 1300
  • Karma: +10/-1
[RISOLTO]Possibile memory leak?
« Risposta #4 il: 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
« Ultima modifica: Settembre 18, 2020, 11:31:38 am da bonmario »

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2870
  • Karma: +20/-4
Re:[RISOLTO]Possibile memory leak?
« Risposta #5 il: 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
Imagination is more important than knowledge (A.Einstein)

bonmario

  • Hero Member
  • *****
  • Post: 1300
  • Karma: +10/-1
Re:[RISOLTO]Possibile memory leak?
« Risposta #6 il: 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

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2870
  • Karma: +20/-4
Re:[RISOLTO]Possibile memory leak?
« Risposta #7 il: 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
Imagination is more important than knowledge (A.Einstein)

bonmario

  • Hero Member
  • *****
  • Post: 1300
  • Karma: +10/-1
Re:[RISOLTO]Possibile memory leak?
« Risposta #8 il: Settembre 18, 2020, 05:32:51 pm »
Sì, grazie, ormai l'ho riscritto usando una classe al posto del record

 

Recenti

How To

Utenti
  • Utenti in totale: 785
  • Latest: gmax
Stats
  • Post in totale: 18769
  • Topic in totale: 2232
  • Online Today: 30
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 22
Total: 22

Disclaimer:

Questo blog non rappresenta una testata giornalistica poiché viene aggiornato senza alcuna periodicità. Non può pertanto considerarsi un prodotto editoriale ai sensi della legge n. 62/2001.