Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [Borland C++] Liberare Memoria

    Ciao..

    Sto sviluppando un programma che utilizza diverse Form.
    Per diversi motivi ho la Form principale (F_main) che Apre una Form (F_Stampa) questa form ne apre un altra (F_Impostazioni_stampa).

    Come si puo intuire si apre una Form per Stampare un documento, dalla Form Principale, e questa Form aperta ne apre un'altra per le Impostazioni. Alla chiusura della form di stampa (F_Stampa) faccio chiudere anche la Form di Impostazione Stampa ( Tutte e due usando Form->Close(); ) pero questo non mi libera la memoria occupata (guardando dal task maneger di Windows ma memoria utilizzata dal programma non diminuisce e resta sui 12Mb).

    Secondo me e memoria "sprecata" perche le form di Stampa non vengono utilizzate fino a una nuova stampa ( cioe per diverso tempo si ha memoria occupata inutilmente ).

    Io volevo liberare la memoria utilizzata da queste form, ho provato ->Free ->Destroy ma niente..

    Poi ho notato che le form vengono create all'avvio delle Applicazione (Guardando il project.cpp ho visto Form->Create ecc) pero quando le visualizzo ( Form->Show dalla form pricipale sull evento Onclik di un bottone) solo a qul punto la memoria aumenta di 1 Mb, e Dovuto al fatto che i componenti vengono creati in quel momento?

    Comunque Come posso liberare memoria? Cioe fare in modo che quando si preme Stampa la Form Viene Creata e qundo si Preme Close la Form viene discrutta e libera la memoria. :master:

    Grazie a Tutti...
    Il linguaggio migliore e quello che ti crei da solo...

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Si tratta di una problematica spinosa.

    Innanzitutto, va detto che il Task Manager non è così affidabile nella misurazione della memoria effettiva occupata; inoltre, Windows contiene i propri algoritmi di pulizia della memoria e l'applicazione include codice VCL che esegue diverse operazioni in grado di variare la memoria occupata in base - ad esempio - agli elementi visibili sullo schermo.

    In definitiva, senza uno strumento di "profiling" avanzato, non darei eccessivo affidamento alla precisione del Task Manager.

    Da quanto hai scritto, sembra che le form a cui ti riferisci venga utilizzati solamente come modali: questo significa che vengono aperte al momento giusto, utilizzate e poi chiuse, prima di ritornare al programma principale (o alla routine chiamante in questione).

    Secondo me, è inutile porre tali form in Auto create poichè non ha senso "prenotare" e occupare spazio in memoria per finestre che verranno visualizzate solo in seguito, oppure mai. E' possibile creare le finestre quando serve visualizzarle, mostrarle a video con il metodo ShowModal e distruggerle quando queste vengono chiuse, garantendo il rilascio delle risorse occupate attraverso il costrutto try...finally.

    In poche parole, suggerisco la loro rimozione dall'elenco di form poste in Auto create; per crearle, visualizzarle e distruggerle userei un costrutto di questo tipo:
    codice:
      AForm := TForm.Create(nil);
      try
        AForm.ShowModal;
      finally
        AForm.Free;
      end;
    (ho scritto in Delphi perchè non sopporto l'intricata sintassi del C++)

    Sostanzialmente, utilizzi una variabile locale avente lo stesso tipo del form da creare; attraverso il costruttore Create istanzi una nuova form, la visualizzi con il metodo ShowModal e, quando questa viene chiusa, liberi la memoria allocata chiamando il metodo Free. Non è richiesto nient'altro.

    Ovviamente, il tuo codice deve essere ben organizzato per poter utilizzare con successo questo approccio; ad esempio, se nella tua classe o in altri punti del codice dell'applicazione hai fatto esplicito riferimento alla variabile creata automaticamente in ogni modulo che identifica la form, nel peggiore dei casi anche nel codice della form stessa, dubito che ti riuscirà il gioco.

    Questo è comunque il modo più corretto di procedere per il rilascio di ogni risorsa in genere; non sono consapevole di altre istanze o strutture dati in genere che crei nel resto dell'applicazione, quindi non posso garantirti che siano a prova di "memory leak", ma per questo puoi controllare tu.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Grazie Mille Alka.....

    Provo e se ho problemi ti faccio sapere...

    Grazie Ancora..
    Il linguaggio migliore e quello che ti crei da solo...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.