Bonjour à tous,

Après avoir trouvé dans les forums des sujets similaires, je n'en ai pas trouvé qui m'aident à comprendre ce problème.

Voici tout d'abord le code qui m'embète pas mal ...

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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
 
 
  // Déclarations ...
 
  liste_resultat          : TList;
 
  PMateriel = ^TMateriel;
 
  // Structure d'un matériel pour les calculs
  TMateriel = record
                Id              : integer;
                Nom             : string[50];
                Electrification : shortint;
                Vitesse_max     : word;
                Resultat        : single;
                Resultat_300m   : single;
                zone_annonce    : smallint;
                liste_zone      : TList;
              end;
 
  PZone = ^TZone;
 
  // Structure d'une zone élémentaire
  TZone  =    record
                Numero            : ShortInt;
                Liste_parcours    : TList;
              end;
 
  PParcours = ^TParcours;
 
  // Structure d'un parcours
  TParcours  = record
                 Pk_depart     : String[7];
                 Pk_arrive     : String[7];
                 Vts_depart    : Integer;
                 Vts_arrive    : Integer;
                 Type_portion  : shortint;
                 Decli         : Integer;
                 Incli         : Smallint;
                 Distance      : Integer;
                 Temps         : Extended;
               end;
 
 
procedure TFraCalcul.Liberer_memoire();
var
  AMateriel : PMateriel;
  AZone     : PZone;
  AParcours : PParcours;
  i,j,k         : integer;
 
begin
 
   for i:= 0 to liste_resultat.Count - 1 do
   begin
      AMateriel := liste_resultat.Items[i];
      for j:= 0 to AMateriel.liste_zone.Count - 1 do
      begin
         AZone := AMateriel.liste_zone.Items[j];
         for k:= 0 to AZone.Liste_parcours.Count - 1 do
         begin
            AParcours := AZone.Liste_parcours.Items[k];
            Dispose(AParcours);
         end;
         FreeAndNil(Azone.Liste_parcours);
         Dispose(AZone);
      end;
      FreeAndNil(AMateriel.liste_zone);
      Dispose(AMateriel);
  end;
  FreeAndNil(liste_resultat);
 
end;
Ma question est : Pourquoi lorsque j'utilise le debuggeur de Delphi 7, il m'indique que AZone, AMateriel et AParcours sont encore accessibles alors que je viens de faire le Dispose.
J'ai l'impression qu'il ne libère pas les ressources mémoires.

Je n'ai pas non plus envie de mettre un car cela ne me dira pas si la ressource a bien été libérée. Je saurais seulement que je n'y accède plus ...

Le pire c'est que lorsque je fais 2 Dispose à la suite pour vérifier qu'il m'a bien libérer les ressources, j'ai bien une exception ! Néanmoins mes ressources mémoires allouées ne diminuent pas ...

Merci