liberation de la memoire utilise

liberation de la memoire utilise - Delphi/Pascal - Programmation

Marsh Posté le 10-05-2005 à 12:41:50    

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
Reply

Marsh Posté le 10-05-2005 à 12:41:50   

Reply

Marsh Posté le 10-05-2005 à 14:07:51    

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


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 11-05-2005 à 09:36:43    

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
Reply

Marsh Posté le 11-05-2005 à 09:41:25    

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
Reply

Marsh Posté le 11-05-2005 à 10:34:07    

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
Reply

Marsh Posté le 11-05-2005 à 10:38:29    

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
Reply

Marsh Posté le 11-05-2005 à 11:07:47    

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
Reply

Marsh Posté le 11-05-2005 à 11:12:58    

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
Reply

Marsh Posté le 11-05-2005 à 11:16:41    

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
Reply

Marsh Posté le 11-05-2005 à 11:20:30    

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
Reply

Marsh Posté le 11-05-2005 à 11:20:30   

Reply

Marsh Posté le 11-05-2005 à 12:27:45    

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


---------------
Hypollite
Reply

Marsh Posté le 11-05-2005 à 12:48:23    

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
Reply

Marsh Posté le 11-05-2005 à 13:20:42    

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
Reply

Marsh Posté le 11-05-2005 à 14:47:16    

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
Reply

Marsh Posté le 11-05-2005 à 16:08:07    

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
Reply

Marsh Posté le 11-05-2005 à 16:13:30    

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
Reply

Marsh Posté le 11-05-2005 à 17:10:17    

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
Reply

Marsh Posté le 11-05-2005 à 17:11:10    

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
Reply

Marsh Posté le 11-05-2005 à 17:36:33    

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
Reply

Marsh Posté le 11-05-2005 à 17:45:26    

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


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 12-05-2005 à 08:51:32    

lE PHENOMEME EST TUOJOUR LE MEME


---------------
Hypollite
Reply

Marsh Posté le 12-05-2005 à 12:54:24    

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
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed