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

Langage Delphi Discussion :

Tableau et gestion de mémoire


Sujet :

Langage Delphi

  1. #1
    Aos
    Aos est déconnecté
    Membre habitué

    Profil pro
    Inscrit en
    janvier 2006
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2006
    Messages : 189
    Points : 184
    Points
    184
    Par défaut Tableau et gestion de mémoire
    Bonjour,

    J'ai une procedure qui va recuperer dans un fichier texte des informations et qui remplit un tableau. (5000 entrées environ).

    Cela prend 2Mo de mèmoire.

    Apres avoir fini de traiter les informations du tableau, je souhaiterai libéré cette mémoire.

    donc je fais une boucle sur le tableau

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for i := 0 to length(CPVILLE) - 1 do
      begin
        CPVILLE[i][0]:='';
        CPVILLE[i][1]:='';
      end;
    Mais rien n'y fait, les 2Mo ne sont pas libérées.
    Oui 2Mo c'est peu, mais la procédure est exécuté au moins 500x par jour.

    Oui je peux largement régler le problème autrement, mais j'aimerai tout de même savoir comment récupérer cette mémoire par acquis de conscience .

    Est-il possible de "détruire" un tableau ?

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Profil pro
    Inscrit en
    septembre 2008
    Messages
    5 155
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : septembre 2008
    Messages : 5 155
    Points : 11 332
    Points
    11 332
    Par défaut
    Mets simplement la taille du tableau a zéro.


  3. #3
    Aos
    Aos est déconnecté
    Membre habitué

    Profil pro
    Inscrit en
    janvier 2006
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2006
    Messages : 189
    Points : 184
    Points
    184
    Par défaut
    Ce n'est pas un tableau dynamique
    Le tableau est defini comme tel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CPVILLE : array [0..2950,0..1] of string;

  4. #4
    Aos
    Aos est déconnecté
    Membre habitué

    Profil pro
    Inscrit en
    janvier 2006
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2006
    Messages : 189
    Points : 184
    Points
    184
    Par défaut
    Bon, comme dis plus haut, j'ai résolu le problème (ou plutôt contourné le problème) sans utilisation de tableau statique.

    Je laisse tout de même le poste ouvert encore aujourd'hui au cas ou quelqu'un aurait une solution éventuelle.

  5. #5
    Inactif  
    Inscrit en
    novembre 2008
    Messages
    255
    Détails du profil
    Informations forums :
    Inscription : novembre 2008
    Messages : 255
    Points : 262
    Points
    262
    Par défaut
    Bonjour

    mets le tout dans une classe et libère cette dernière à la fin

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      Tmesdonnes = class
      CPVILLE: array[0 .. 50000] of string ;
      end;

    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
     
    var
      maclasse : Tmesdonnes;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.charger(Sender: TObject);
    var
    i : integer ;
    begin
      try
      begin
        maclasse := Tmesdonnes.Create;
        for i:=0  to 50000 do
          maclasse.CPVILLE[i] := '888888888888888888888888888888888'
        end;
      finally
        maclasse.Free
      end;
    end;
    end.

  6. #6
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Citation Envoyé par Aos Voir le message
    Ce n'est pas un tableau dynamique
    Le tableau est defini comme tel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CPVILLE : array [0..2950,0..1] of string;
    si ton tableau est statique, il est alloué :
    - au debut de ta procedure si il est declaré dans une procedure
    - a la creation de l'objet si il appartient a une classe
    - a l'initialisation de l'application si c'est une variable globale

    il sera automatiquement libere a la fin de vie de ce dernier, et je suis quasiment sur qu'il n'y a pas moyen de liberer la memoire autrement.

  7. #7
    Aos
    Aos est déconnecté
    Membre habitué

    Profil pro
    Inscrit en
    janvier 2006
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2006
    Messages : 189
    Points : 184
    Points
    184
    Par défaut
    oui guillemouze, dans la logique, c'est ça, mais mon tableau est JAMAIS liberé, il est la le probleme
    Il appartient a une procedure donc a priori, a la fin de la procedure, il doit etre liberé, mais c'est pas le cas...

    Je le mets en DELESTAGE, le probleme vient peut etre d'ailleurs.
    Si un jour je trouve, je posterai.

    Merci quand meme a tous !

  8. #8
    Inactif  
    Inscrit en
    novembre 2008
    Messages
    255
    Détails du profil
    Informations forums :
    Inscription : novembre 2008
    Messages : 255
    Points : 262
    Points
    262
    Par défaut
    un pointeur fera l'affaire aussi

    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
    procedure charger_decharger;
    type
      TTabTest = array[1..5000] of string;
      PTabTest = ^TTabTest;
    var
      References: PTabTest;
      indx: integer;
    begin
      New(References);
      try
        for indx := 1 to 5000 do
         References^[indx] := 'AZERTYUIOPQSDFGHJKLMWXCVBN'; {ton traitement}
      finally
        Dispose(References);
      end;
    end;

Discussions similaires

  1. Problème de sélection dans un tableau dynamique (gestion des erreurs)
    Par aulilou dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 01/08/2007, 16h38
  2. Tableau paginé + gestion cases à cocher
    Par lili2704 dans le forum Struts 1
    Réponses: 3
    Dernier message: 29/06/2007, 18h02
  3. Problème de gestion de mémoire (segfault)
    Par Michaël dans le forum C
    Réponses: 7
    Dernier message: 26/05/2007, 09h30
  4. Réponses: 5
    Dernier message: 27/03/2007, 09h51
  5. Gestion de Mémoire Java
    Par lebulls dans le forum Langage
    Réponses: 5
    Dernier message: 18/07/2006, 10h35

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