TList : Segfault inexpliquée
Bonjour à vous,
J'ai un objet TCoupeDeveloppee qui contient une propriété FListeDesBranches de type TList.
Le FListeDesBranches contient des objets de type TBrancheCoupeDeveloppee.
Je suis confronté à ce qui semble être un bug du TList, à savoir, un segfault lors de la modification d'un item de FListeDesBranches.
Voici les fonctions d'ajout, d'extraction et de modif:
Code:
1 2 3 4 5 6 7 8 9 10
|
procedure TCoupeDeveloppee.AddBranche(const S: TBrancheCoupeDeveloppee);
var
pB : ^TBrancheCoupeDeveloppee;
begin
AfficherMessageErreur(Format('%s.AddBranche: %s', [ClassName, S.NomBranche]));
New(pB);
pB^ := S;
FListeDesBranches.Add(pB);
end; |
La fonction AddBranche fonctionne très bien
Code:
1 2 3 4 5 6 7 8 9 10
|
function TCoupeDeveloppee.GetBranche(const Idx: integer): TBrancheCoupeDeveloppee;
var
pB : ^TBrancheCoupeDeveloppee;
begin
AfficherMessageErreur(Format('%s.GetBranche: %d', [ClassName, Idx]));
pB := FListeDesBranches.Items[Idx];
result := pB^;
AfficherMessageErreur(Format('%s.GetBranche: %d - %s', [ClassName, Idx, result.NomBranche]));
end; |
Aucun problème pour GetBranche
Le modificateur qui pose problème:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
procedure TCoupeDeveloppee.PutBranche(const Idx: integer; const S: TBrancheCoupeDeveloppee);
var
pB : ^TBrancheCoupeDeveloppee;
begin
AfficherMessageErreur(Format('%s.PutBranche: %d / %d - %s', [ClassName, Idx, FListeDesBranches.Count-1, S.NomBranche]));
pB := self.FListeDesBranches.Items[Idx];
// affectation de la nouvelle valeur
pB^ := S;
// ici, on est OK
AfficherMessageErreur(Format('002: %d - %s - %d', [pB^.NumeroBranche, pB^.NomBranche, pB^.GetNbVisees]));
AfficherMessageErreur(Format(' -- %d / %d', [Idx, self.FListeDesBranches.Count]));
// L'affectation ci-dessous provoque le segfault
// même avec un Idx valide
self.FListeDesBranches.Items[Idx] := pB; // segfault incompréhensible
end; |
J'ai plein d'autres listes qui contiennent des objets et je ne rencontre aucun problème
Je ne comprends pas pourquoi je peux accéder à un item d'un TList et ne pas pouvoir le modifier.
Ce genre de bug exaspérant est de nature à faire abandonner la programmation.
TList injustement incriminé. Annulle le message précédent.
L'instance de l'objet incriminé, créée dans une autre section du programme par une autre personne, avait été instanciée via un TObjectList.Create;