IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

Vidage et libération de la mémoire


Sujet :

C++Builder

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 92
    Points : 46
    Points
    46
    Par défaut Vidage et libération de la mémoire
    Bonjour,

    Je suis sous Builder C++ XE7

    Mon programme donne accès par une liste à des doossiers de données (numériques et alpha).

    Si je double clique dans la liste j'ouvre le dossier de données correspondant.

    Je stocke une partie des données dans un TStrinGrid en allant les chercher dans une base de données, pour éviter d'aller dans cette base de nombreuses fois lors de leur consultation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    StringGrid1 = new TStringGrid(Form1);
    StringGrid1->Parent = Form1;
    StringGrid1->Visible = false;
    StringGrid1->RowCount = 10000;
    StringGrid1->ColCount= 18;
    Ensuite intervient le chargement de données (données statistiques sur des corpus textuels dont la taille peut aller à 100Mo).

    En mémoire, avant ce chargement le programme occupe 100Mo de Ram, après le chargement on peut passer à 300Mo.

    Quand je ferme la fenêtre de consultation, je supprime le tableau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    StringGrid1->Free();
    delete StringGrid1;
    StringGrid1 = NULL;
    Or dans la mémoire, la RAM, (les 200Mo supplémentaires) ne se libèrent pas.

    J'ai déjà utiliser ce type de commande sans il me semble avoir rencontré de problème.

    Merci pour toute indication.

  2. #2
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    Salut
    ce comportement ben que surprenant est normal

    dans ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    StringGrid1 = new TStringGrid(Form1);
    le propriétaire de la Grille est la Form qui est chargée de sa suppression
    si tu désire gérer toi même ce composant ce paramètre doit être NULL

    tu trouvera ci-dessous un code d'exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    le .H
    // ---------------------------------------------------------------------------
     
    #ifndef MainH
    #define MainH
    // ---------------------------------------------------------------------------
    #include <System.Classes.hpp>
    #include <Vcl.Controls.hpp>
    #include <Vcl.StdCtrls.hpp>
    #include <Vcl.Forms.hpp>
    #include <Vcl.Grids.hpp>
    // ---------------------------------------------------------------------------
     
    class TForm140 : public TForm
     {
    	__published: // Composants gérés par l'EDI
    	TButton *Create;
    	TButton *FreeMem;
    	TButton *DeleteGrid;
    	void __fastcall FreeMemClick(TObject *Sender);
    	void __fastcall DeleteGridClick(TObject *Sender);
       private: // Déclarations utilisateur
    		TStringGrid* mGrid;
    		void __fastcall FillGrid();
    	public: // Déclarations utilisateur
    		__fastcall TForm140(TComponent* Owner);
     
      };
     // ---------------------------------------------------------------------------
     extern PACKAGE TForm140 *Form140;
    // ---------------------------------------------------------------------------
    #endif
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    le .cpp
    //---------------------------------------------------------------------------
     
    #include <vcl.h>
    #pragma hdrstop
     
    #include "Main.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm140 *Form140;
    //---------------------------------------------------------------------------
    __fastcall TForm140::TForm140(TComponent* Owner)
    	: TForm(Owner)
    {
     
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm140::CreateClick(TObject *Sender)
    {
       System::Classes::TComponent* AOwner=NULL;
       mGrid= new TStringGrid(AOwner);
       mGrid->ColCount=0;
       mGrid->RowCount=0;
       mGrid->Parent=Form140;
       mGrid->Left=50;
       mGrid->Top=60;
       FillGrid();
       mGrid->Show();
    }
     
    //---------------------------------------------------------------------------
    void  __fastcall TForm140::FillGrid()
    {
      int Ln(10000);
      int cl(100);
      mGrid->ColCount=cl;
      mGrid->RowCount=Ln;
      for (int c=0; c < Ln; c++) {
    	  for(int l=0; l < cl; l++){
    	  mGrid->Cells[c][l]=L"Informations de tests pour vérifier le comportement de la mémoire sous Win32 ";
     
    	  }
     
       }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm140::FreeMemClick(TObject *Sender)
    {
    	for (int Cl=0; Cl < mGrid->ColCount ; Cl++) {
    	 for (int Rw=0; Rw < mGrid->RowCount ; Rw++) {
    	   mGrid->Cells[Cl][Rw]="";
    	 }
    	}
    	mGrid->ColCount=0;
    	mGrid->RowCount=0;
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm140::DeleteGridClick(TObject *Sender)
    {
      delete mGrid;
    }
     
    //---------------------------------------------------------------------------
    Explication

    le bouton Create initialise un composant TStringGrid
    le remplissage de cette Grille est réalisé dans la procédure FillGrid avec 10000 Lignes et 100 colonnes avec un contenu conséquent
    résultat la consommation mémoire passe à 216 Mega
    la libération de la mémoire se passe dans la procédure FreeMemClick on remarque que le tableau est vide mais pas la mémoire consommée
    ce n'est que lorsque la procédure DeleteGridClick est appelée que le tableau est détruit et la mémoire revient pratiquement à son occupation avant l'appel

    Conclusion gère toi même le composant

    cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

Discussions similaires

  1. Libération de la mémoire
    Par Premium dans le forum C
    Réponses: 4
    Dernier message: 09/08/2006, 18h15
  2. [CSV] Libération de la mémoire
    Par cedricgirard dans le forum Langage
    Réponses: 7
    Dernier message: 05/01/2006, 12h02
  3. libération de la mémoire après traitement ?
    Par isachat666 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 07/12/2005, 19h29
  4. [VB]Libération de la mémoire
    Par seroa dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 12/10/2005, 11h52
  5. Libération de la mémoire
    Par gibet_b dans le forum Composants VCL
    Réponses: 3
    Dernier message: 30/06/2004, 12h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo