Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1511 connectés 

  FORUM HardWare.fr
  Programmation
  Delphi/Pascal

  liberation de la memoire utilise

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

liberation de la memoire utilise

n°1077656
Hypollite
Que la force soit avec toi
Posté le 10-05-2005 à 12:41:50  profilanswer
 

Bonjour a tous,
      Je suis tout nouveau sur le Forum de Hardware.fr ainsi que sur Delphi.
Je viens de recuperer un projet devellopez sous delphi 6, une DLL, la fonction est un simple j ai une application qui appelle diverses fonctions de la DLL qui executent les differentes procedures
 
Ma Dll est en faite un tableau de donnee et chaque case de ce tableau est un tableau lui meme, mon application envoie les donnees dans ces differents
Exemple :
Tableau 1  Table 1 [#9b0063][#f0000e]contient 1
Tableau 1  Table 2 contient 2
Tableau 1  Table 3 contient 3
Tableau 1  Table 4 contient 4
   :
   :
Tableau 1  Table X contient X
Tableau 2  Table 1 contient 1
 
Lors de l execution de l application, ma memoire dans le gestionnaire des taches-> Processus s aggrandit quand je remplis mon tableau via la DLL
 
dans ma DLL, declaration du tableau

Code :
  1. type
  2. TpJobs= record
  3.   Table       : array of Pchar;
  4.   count      : integer;
  5. end;
  6. const
  7. MAXJOBNUMBER=100;                                       // Nbre max de Job
  8. var
  9.   Tableau: Array[1..MAXJOBNUMBER] of TpJobs;


 
Comment faire pour liberer ma memoire en sachant qu a la fin de ma fonction de la DLL je fais un SetLength(Tableau[Num].Table,0);
 
 
cela fait 1 semaine que je suis dessus et je pete un plomb :pt1cable:


---------------
Hypollite
mood
Publicité
Posté le 10-05-2005 à 12:41:50  profilanswer
 

n°1077783
antp
Super Administrateur
Champion des excuses bidons
Posté le 10-05-2005 à 14:07:51  profilanswer
 

Ton pointeur "Table" de chaque Record il est rempli/assigné comment ?


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°1078874
Hypollite
Que la force soit avec toi
Posté le 11-05-2005 à 09:36:43  profilanswer
 

antp a écrit :

Ton pointeur "Table" de chaque Record il est rempli/assigné comment ?


 
mon application transmet a la DLL la variable cmd qui correspond a un texte , exemple 'Essai'

Code :
  1. Tableau[i].Table[Tableau[i].count-1]:=StrAlloc(strlen(cmd)+13);
  2.         strcopy(Tableau[i].Table[Tableau[i].count-1],'OPENDEVICE(');
  3.         strcat(Tableau[i].Table[Tableau[i].count-1],cmd);
  4.         strcat(Tableau[i].Table[Tableau[i].count-1],')');


 
a le count, sert seulement a me deplacer dans ma Table.


---------------
Hypollite
n°1078881
antp
Super Administrateur
Champion des excuses bidons
Posté le 11-05-2005 à 09:41:25  profilanswer
 

Quand tu fais un StrAlloc, il faut faire un StrDispose pour libérer la mémoire quand tu n'en as plus besoin :o
T'as quelle version de Delphi ? Normalement il aurait dû te prévenir que StrAlloc est deprecated.
 
Et pour ton code, il aurait été plus simple de faire :
 
      strcopy(Tableau[i].Table[Tableau[i].count-1], PChar('OPENDEVICE(' + cmd + ')'));
 
non ? :D


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°1078975
Hypollite
Que la force soit avec toi
Posté le 11-05-2005 à 10:34:07  profilanswer
 

antp a écrit :

Quand tu fais un StrAlloc, il faut faire un StrDispose pour libérer la mémoire quand tu n'en as plus besoin :o
T'as quelle version de Delphi ? Normalement il aurait dû te prévenir que StrAlloc est deprecated.
 
Et pour ton code, il aurait été plus simple de faire :
 
      strcopy(Tableau[i].Table[Tableau[i].count-1], PChar('OPENDEVICE(' + cmd + ')'));
 
non ? :D


 
en effet , cela est beaucoup plus simple, il faut savoir, que ce n est pas moi qui devellope la DLL, la personne est parti et je reprends le dada :bounce: afin de la deboguer, sympa comme cadeau :??:  
 
 
j ai la version 6, je ne comprends pas ce que tu veux dire avec stralloc
 
pour ce qui est de strdispose

Code :
  1. j:= Tableau[TheHdle].count
  2. for i:=0 to j do
  3. begin
  4. strdispose(Tableau[TheHdle].Table[Tableau[TheHdle].count-1]);
  5. Tableau[TheHdle].count:=Tableau[TheHdle].count-1;
  6. end;


ce qui est etonnant, quand je suis en deboguage il me met des carrees dans mes donnes au lieu de les vider alors que quand je fais    

Code :
  1. SetLength(Tableau[TheHdle].table,0);

, je n ai plus rien dans table en visu.
j est le nombre de donnee dans ma table, j ai essaye mais toujours autant de memoire utilise, au debut mon application fait 3 Ko apres remplissage des tables 5Ko, et quand j effectue le strdispose, idem 5Ko . Je te parle la d un petit remplissage 68 donnees, mais quand je passe a 1000 donnees, alors j atteins les 100Ko
 
je commence a perdre la tete  :cry: avec ces allocations et memoire, suis je dans le bon chemin est ce normal qu une application grossise et ne se libere pas, je me poses des questions, je suis perdu ou est la sortie  :(


---------------
Hypollite
n°1078986
antp
Super Administrateur
Champion des excuses bidons
Posté le 11-05-2005 à 10:38:29  profilanswer
 

Ouais enfin sur 100 Ko c'est pas fiable comme test. Le gestionnaire de mémoire de Delphi réserve de la mémoire sur demande mais ne la rend à Windows que par gros paquets, il garde une "marge" il me semble. Il faudrait essayer de consommer 100 Mo, et là tu verras bien si c'est libéré :D


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°1079065
Hypollite
Que la force soit avec toi
Posté le 11-05-2005 à 11:07:47  profilanswer
 

antp a écrit :

Ouais enfin sur 100 Ko c'est pas fiable comme test. Le gestionnaire de mémoire de Delphi réserve de la mémoire sur demande mais ne la rend à Windows que par gros paquets, il garde une "marge" il me semble. Il faudrait essayer de consommer 100 Mo, et là tu verras bien si c'est libéré :D


pour te dire que je pers la tete je parle de Mo au lieu de Ko, ca y est mes neurones se mettent eux aussi a ne plus liberer la memoire :lol:  


---------------
Hypollite
n°1079080
antp
Super Administrateur
Champion des excuses bidons
Posté le 11-05-2005 à 11:12:58  profilanswer
 

Je m'y retrouve plus dans tes tableaux de tableaux :D
Il doit y avoir une fuite mémoire mais là comme ça je vois pas :/


Message édité par antp le 11-05-2005 à 11:14:02

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°1079084
Hypollite
Que la force soit avec toi
Posté le 11-05-2005 à 11:16:41  profilanswer
 

antp a écrit :

Je m'y retrouve plus dans tes tableaux de tableaux :D
Il doit y avoir une fuite mémoire mais là comme ça je vois pas :/


 
comment peut on voir la fuite ou comment la trouver et surtout comment la resoudre :(


---------------
Hypollite
n°1079091
antp
Super Administrateur
Champion des excuses bidons
Posté le 11-05-2005 à 11:20:30  profilanswer
 

Il y a des softs pour ça mais je n'en connais pas (enfin, le seul que je connaisse n'existe plus) et je ne sais pas si ça existe en gratuit


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
mood
Publicité
Posté le 11-05-2005 à 11:20:30  profilanswer
 

n°1079241
Hypollite
Que la force soit avec toi
Posté le 11-05-2005 à 12:27:45  profilanswer
 

Connais tu quelqu un qui pourrait m aiguiller? venir a mon aide


---------------
Hypollite
n°1079266
antp
Super Administrateur
Champion des excuses bidons
Posté le 11-05-2005 à 12:48:23  profilanswer
 

Vérifie bien que tu ne fais pas d'autres allocations mémoire, ou que pour chaque allocation tu fais bien la libération correspondante.
Tu as vérifié que les StrDispose sont bien effectués ?
Tu peux tenter de les replacer par des GetMem & FreeMem, parce que StrAlloc & StrDispose c'est pas vraiment recommandé, je ne suis pas sûr que ce soit prévu pour les PChar en fait...


Message édité par antp le 11-05-2005 à 12:49:42

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°1079294
Hypollite
Que la force soit avec toi
Posté le 11-05-2005 à 13:20:42  profilanswer
 

Comment verifier que le strdispose soit bien effectues?
Les GetMem & FreeMem utilise les pointeurs, alors dans la DLL, il n y a pas de pointeur


---------------
Hypollite
n°1079496
antp
Super Administrateur
Champion des excuses bidons
Posté le 11-05-2005 à 14:47:16  profilanswer
 

Hypollite a écrit :

Comment verifier que le strdispose soit bien effectues?
Les GetMem & FreeMem utilise les pointeurs, alors dans la DLL, il n y a pas de pointeur


 
PChar = ^Char = pointeur sur une variable Char :D En Delphi t'as des pointeurs partout sans les voir (tous les objets et toutes les chaînes sont des pointeurs)
 
Et pour vérifier, mets un point d'arrêt (breakpoint) sur la ligne du StrDispose pour voir s'il y passe bien en boucle


Message édité par antp le 11-05-2005 à 14:48:06

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°1079689
Hypollite
Que la force soit avec toi
Posté le 11-05-2005 à 16:08:07  profilanswer
 

oui il y passe bien en boucle  
pour ce qui est de l utilisation du freemem, avec mon appli et mes tableaux
FreeMem(Tableau[TheHdle].Table^) est ce correct ou pas


---------------
Hypollite
n°1079708
antp
Super Administrateur
Champion des excuses bidons
Posté le 11-05-2005 à 16:13:30  profilanswer
 

Heu non, Table c'est un array, pas un pointeur, non ?
Tu vas exploser tout là :D
FreeMem(Tableau[TheHdle].Table[i])
pour libérer chacun des PChar alloués


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°1079792
Hypollite
Que la force soit avec toi
Posté le 11-05-2005 à 17:10:17  profilanswer
 

j ai un message lors de l execution du freemem du type
Appliction.exe raised exception class EIinvalidpointer with message invalid pointer operation. Process stopped


---------------
Hypollite
n°1079794
antp
Super Administrateur
Champion des excuses bidons
Posté le 11-05-2005 à 17:11:10  profilanswer
 

Bah oui ça c'est quand tu fais un FreeMem sur un truc que tu ne peux pas libérer :o (tu fais bien un FreeMem sur un truc alloué par GemMem ?)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°1079851
Hypollite
Que la force soit avec toi
Posté le 11-05-2005 à 17:36:33  profilanswer
 

antp a écrit :

Bah oui ça c'est quand tu fais un FreeMem sur un truc que tu ne peux pas libérer :o (tu fais bien un FreeMem sur un truc alloué par GemMem ?)


  :heink: quelle idiot je suis , jai laisse le stralloc, dis moi je fais ca c est correct
 

Code :
  1. getmem(Tableau[i].Table[j],sizedonne)


comment fais tu pour connaitre la taille en octet de mon sizedonne


---------------
Hypollite
n°1079871
antp
Super Administrateur
Champion des excuses bidons
Posté le 11-05-2005 à 17:45:26  profilanswer
 

strlen(cmd)+13, comme tu faisais pour stralloc


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°1080504
Hypollite
Que la force soit avec toi
Posté le 12-05-2005 à 08:51:32  profilanswer
 

lE PHENOMEME EST TUOJOUR LE MEME


---------------
Hypollite
n°1080733
Hypollite
Que la force soit avec toi
Posté le 12-05-2005 à 12:54:24  profilanswer
 

Hypollite a écrit :

lE PHENOMEME EST TUOJOUR LE MEME


j ai trouve le disfonctionnement, c etait le decomptage lors du strdispose, maintenant cela fonctionne correctement avec le strdipose  :sweat: .
 
Merci a Antp pour ton aide  ;)


---------------
Hypollite
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Delphi/Pascal

  liberation de la memoire utilise

 

Sujets relatifs
STL et libération mémoireLibération de mémoire qui ne se fait pas...
[C] problème avec libération de la mémoire[C] plantage a la liberation de la memoire
Thread, prob libération mémoirePHP & requêtes mySQL : optim : libération mémoire en cours de script ?
Application.Terminate et libération mémoire / objetsScript Liberation mémoire vive ?
--LIBERATION MEMOIRE-- Garbage collectorlibération espace mémoire PHP
Plus de sujets relatifs à : liberation de la memoire utilise


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR