J'ai une classe qui implémente une interface, qui est rendue disponible pour les plugins. La déclaration de classe est assez simple. Il n'y a qu'une seule instance de cette classe pour une application entière. Lorsque la fonction qui renvoie l'interface est appelée, elle appelle _AddRef sur l'interface récupérée avant de la renvoyer comme résultat. Malheureusement, cela fonctionne jusqu'à ce que j'essaie de libérer l'objet (voir la section «finalisation») - il signale une opération de pointeur invalide. Si je le commente, cela fonctionne très bien (cependant FastMM signale des fuites de mémoire, donc l'objet n'est pas libéré).Delphi7, passant l'interface de l'objet - provoque une opération de pointeur invalide lors de la libération de l'objet
Voici la partie du code dans la fonction qui retourne l'interface (en fait c'est une QueryInterface surchargée de ma classe "ServicesManager").
if ConfigManager.GetInterface(IID, obj) then
begin
ISDK_ConfigManager(obj)._AddRef;
result:= 0;
end
et le code de la classe ConfigManager ...
type
TConfigManager = class(TInterfacedObject, ISDK_ConfigManager)
private
...
end;
var
ConfigManager: TConfigManager;
implementation
...
initialization
ConfigManager:= TConfigManager.Create();
finalization
if ConfigManager <> nil then
FreeAndNil(ConfigManager); //if I comment it out, it leaks the memory but no Invalid Ptr. Op. raises
Qu'est-ce que je fais mal? Je dois transmettre une référence à exactement cette instance de ConfigManager.
Que fait TConfigManager.Destroy? – Ozan
rien qui causerait une erreur. pour être sûr que je l'ai commenté aussi bien avant de poster ici, ne m'a pas aidé ... – migajek
ok j'ai trouvé une * solution de contournement *, pas un * correctif *. Au lieu d'appeler FreeAndNil, j'appelle ._release ... Mais toujours à la recherche d'une réponse !! – migajek