Précédent   Forum du club des développeurs et IT Pro > Autres langages > Pascal > Langage
Langage Vos questions sur langage Pascal en général, ses évolutions, les technologies, ...
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 26/08/2011, 22h42   #1
Miflon
Invité de passage
 
Michel DEBERNARD
Retraité
Inscription : décembre 2007
Messages : 24
Détails du profil
Informations personnelles :
Nom : Michel DEBERNARD
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Retraité
Secteur : Enseignement

Informations forums :
Inscription : décembre 2007
Messages : 24
Points : 4
Points : 4
Par défaut Libération de pointeurs d'une liste doublement chaînée

Bonjour à toutes et à tous.
Dans une liste doublement chaînée, un seul pointeur permet de parcourir toute la liste dans un sens ou dans l'autre. A la fermeture du programme, faut-il libérer les pointeurs de chaque enregistrement de la liste ou un seul d'entre eux ? Faut-il vider (nil pour les deux pointeurs, chaînes vides pour les string, annuler les entiers et réels...) chaque élément de chaque enregistrement ? Quelles sont les conséquences en termes de fonctionnement de l'ordinateur si cela n'est pas fait ?
Merci d'avance pour vos réponses et conseils.
Miflon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2011, 01h16   #2
M.Dlb
Rédacteur/Modérateur

 
Avatar de M.Dlb
 
Inscription : avril 2002
Messages : 2 278
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : avril 2002
Messages : 2 278
Points : 3 434
Points : 3 434
Attention, un pointeur est un type de variable qui contient l'adresse de début d'une zone mémoire. Un pointeur n'est pas de la mémoire, donc dire "libérer un pointeur" est un peu incorrect. Il faudrait plutôt dire "libérer la zone mémoire pointée par le pointeur".

Tout ça pour dire: une liste chaînée est une liste de pointeurs, qui pointent chacun sur des zones mémoire différentes. Quand tu libères ta chaîne entière, tu dois donc libérer chaque zone pointée par les pointeurs formant la chaîne, et non pas qu'un seul.

L'impact sur la machine, c'est qu'il reste de la mémoire allouée, qui ne peut pas être utilisée par la suite par les autres programmes. C'est la théorie, car en pratique, je ne suis pas certain que cela reste vrai avec les operating systems modernes que sont entre autres Windows et Linux.
__________________
M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal
M.Dlb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2011, 07h38   #3
Paul TOTH
Expert Confirmé Sénior
 
Avatar de Paul TOTH
 
Homme Paul TOTH
Freelance
Inscription : novembre 2002
Messages : 4 540
Détails du profil
Informations personnelles :
Nom : Homme Paul TOTH
Âge : 43
Localisation : Réunion

Informations professionnelles :
Activité : Freelance
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2002
Messages : 4 540
Points : 11 916
Points : 11 916
pour faire simple, je dirais qu'il faut libérer ce qui a été alloué...

je m'explique par un exemple:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
var
  Data: array [0..100] of TData;
  First: PData;
  Item: PData;
  i     : Integer;
begin
  First := nil;
  for i := 0 to 100 do
  begin
    Item := @Data[i];
    Item.Next := First;
    First := Item;
  end;
end;
dans le code ci-dessus j'ai une liste chaînée avec des pointeurs sur des structures allouées statiquement...je n'ai donc rien à libérer

Code :
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
 
type
  TItem = class
    Prev: TItem;
    Next: TItem;
  end;
var
  First: TItem;
  Item: TItem;
  Last: TItem;
  i : Integer;
begin
  First := nil;
  for i := 0 to 10 do
  begin
    Item := TItem.Create;
    if First = nil then
      First := Item
    else
      Last.Next := Item;
    Last := Item;
  end;
//...
  while First <> nil do
  begin
    Item := First;
    First := Item.Next;
    Item.Free;
  end;
end;
ici on a une double liste chaînée, pour la libérer, il faut détruire (une fois évidemment) chaque noeud...on peut parcourir la liste dans un sens ou dans l'autre, mais une seule fois.

Note que tes éléments peuvent aussi faire parti de plusieurs listes chaînées, là encore il ne faut les libérer qu'une fois et supprimer les références dans les autres listes.
__________________
Developpez.com: Mes articles, forum FlashPascal
Entreprise: Execute SARL
Produits : UPnP, RemoteOffice, FlashPascal
Embarcadero : Ile de la Réunion, Dephi, C++Builder, RADPHP...TVA à 8,5%
Paul TOTH est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 01/09/2011, 11h02   #4
Miflon
Invité de passage
 
Michel DEBERNARD
Retraité
Inscription : décembre 2007
Messages : 24
Détails du profil
Informations personnelles :
Nom : Michel DEBERNARD
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Retraité
Secteur : Enseignement

Informations forums :
Inscription : décembre 2007
Messages : 24
Points : 4
Points : 4
Bonjour à toutes et à tous.
Merci pour les réponses déjà fournies.
Je comprends la nécessité de libérer la mémoire dans une procédure ou un programme pour éviter l'erreur "Out of memory". Mais que se passe-t-il à la sortie de cette procédure ou de ce programme ?
J'aimerais connaître la quantité de mémoire allouée à l'entrée et à la sortie d'une procédure (ou d'un programme) où est définie localement une liste doublement chaînée. Quelles sont les fonctions permettant cela en Free Pascal et quelle est l'unité où elles sont définies? Dans Delphi il me semble que les fonctions AllocMemCount et AllocMemSize le permettent.
Merci d'avance pour votre aide.
Miflon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/09/2011, 11h24   #5
M.Dlb
Rédacteur/Modérateur

 
Avatar de M.Dlb
 
Inscription : avril 2002
Messages : 2 278
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : avril 2002
Messages : 2 278
Points : 3 434
Points : 3 434
Il me semble que AllocMemSize et AllocMemCount ne sont pas disponible sur FreePascal. Tu peux regarder GetHeapStatus:

http://www.freepascal.org/docs-html/...eapstatus.html


Sinon, tu peux faire le calcul par toi même. Un pointeur dans un monde 32 bits fait 4 octets, il te suffit de calculer la taille de la structure stockée dans la liste chaînée, multiplier par le nombre d'éléments, et tu as la taille de la liste en mémoire.
__________________
M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal
M.Dlb est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 16h01.


 
 
 
 
Partenaires

Hébergement Web