liberation de la memoire utilise - Delphi/Pascal - Programmation
Marsh Posté le 10-05-2005 à 14:07:51
Ton pointeur "Table" de chaque Record il est rempli/assigné comment ?
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 :
|
a le count, sert seulement a me deplacer dans ma Table.
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
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 ?
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 |
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 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 :
|
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 :
|
, 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 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
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é
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é |
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
Marsh Posté le 11-05-2005 à 11:12:58
Je m'y retrouve plus dans tes tableaux de tableaux
Il doit y avoir une fuite mémoire mais là comme ça je vois pas
Marsh Posté le 11-05-2005 à 11:16:41
antp a écrit : Je m'y retrouve plus dans tes tableaux de tableaux |
comment peut on voir la fuite ou comment la trouver et surtout comment la resoudre
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
Marsh Posté le 11-05-2005 à 12:27:45
Connais tu quelqu un qui pourrait m aiguiller? venir a mon aide
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...
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
Marsh Posté le 11-05-2005 à 14:47:16
Hypollite a écrit : Comment verifier que le strdispose soit bien effectues? |
PChar = ^Char = pointeur sur une variable Char 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
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
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à
FreeMem(Tableau[TheHdle].Table[i])
pour libérer chacun des PChar alloués
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
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 (tu fais bien un FreeMem sur un truc alloué par GemMem ?)
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 (tu fais bien un FreeMem sur un truc alloué par GemMem ?) |
quelle idiot je suis , jai laisse le stralloc, dis moi je fais ca c est correct
Code :
|
comment fais tu pour connaitre la taille en octet de mon sizedonne
Marsh Posté le 11-05-2005 à 17:45:26
strlen(cmd)+13, comme tu faisais pour stralloc
Marsh Posté le 12-05-2005 à 08:51:32
lE PHENOMEME EST TUOJOUR LE MEME
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 .
Merci a Antp pour ton aide
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
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
---------------
Hypollite