Interface, référence et destructeur
Bonjour,
J'ai le code suivant :
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| { IAgent }
IAgent = interface
procedure Notify(AMarket : TMarket; AAct : Char; ACommodity : Integer; APrice : Single; ASuccess : Boolean);
procedure UpdateInventory(const ACommodity : Integer; const ADelta : Integer);
procedure UpdateMoney(const ADelta : Single);
end;
{ TOffer }
TOffer = class
{ Commodity }
FCommodity : Integer;
{ Agent }
FAgent : IAgent;
{ Quantity }
FQuantity : Integer;
{ Price }
FPrice : Single;
{ Class constructor }
constructor Create(ACommodity : Integer; AAgent : IAgent; AQuantity : Integer; APrice : Single);
end;
TSimpleAgent = class(TInterfacedObject, IAgent)
procedure Notify(AMarket : TMarket; AAct : Char; ACommodity : Integer; APrice : Single; ASuccess : Boolean);
procedure UpdateInventory(const ACommodity : Integer; const ADelta : Integer);
procedure UpdateMoney(const ADelta : Single);
end;
TMarket = class
private
{ Buy offer books }
FBuyOfferBooks : TOfferMap;
{ Sell offer books }
FSellOfferBooks : TOfferMap;
FDemands : TIntegerMap;
FSupplies : TIntegerMap;
FPrices : TSingleMap;
public
constructor Create;
procedure AddBuyOffer(AOffer : TOffer);
procedure AddSellOffer(AOffer : TOffer);
procedure ResolveOffers(ACommodity : Integer);
function GetAveragePrice(const ACommodity : Integer) : Single; virtual;
function GetDemand(const ACommodity : Integer) : Integer;
function GetSupply(const ACommodity : Integer) : Integer;
destructor Destroy; override;
end; |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
//une classe de test avec :
FAgent := TSimpleAgent.Create;
//offres d'achat
FMarket.AddBuyOffer(TOffer.Create(WOOD, FAgent, 50, 2.8));
FMarket.AddBuyOffer(TOffer.Create(WOOD, FAgent, 30, 3.2));
FMarket.AddBuyOffer(TOffer.Create(WOOD, FAgent, 20, 2.7));
//offres de vente
FMarket.AddSellOffer(TOffer.Create(WOOD, FAgent, 40, 4.3));
FMarket.AddSellOffer(TOffer.Create(WOOD, FAgent, 30, 3.2));
FMarket.AddSellOffer(TOffer.Create(WOOD, FAgent, 20, 3.7));
FMarket.ResolveOffers(WOOD);
//2ème tour
//offres d'achat
FMarket.AddBuyOffer(TOffer.Create(WOOD, TMockAgent.Create, 60, 2.5)); |
Je n'ai pas posté le code complet. Je compléterai si nécessaire.
La classe TSimpleAgent implémente une interface IAgent.
La méthode FMarket.ResolveOffers traite les offres et libère les objets TOffer.
Tout fonctionne bien jusqu'à la fin de l'appel de ResolveOffers. Par contre lorsque j'appelle AddBuyOffer pour le deuxième tour j'obtiens une erreur (exception de class 'External: SIGSEGV').
Je constate que le destructeur de TSimpleAgent est appelé.
Si je crée un nouvel objet TSimpleAgent je n'ai pas cette erreur. Je n'ai pas d'erreur non plus si j'utilise une classe abstraite au lieu d'une interface.
J'ai l'impression que le problème est lié au compteur de référence et la libération automatique des objets qui descendent de TInterfacedObject.