Einzelnen Beitrag anzeigen

shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#4

Re: Interfaces werden nicht dereferenziert

  Alt 1. Jul 2005, 14:16
Zitat von xaromz:
Noch was: Wenn ich mir ein Interface so hole
Delphi-Quellcode:
if (XXX as IMyInterface).IrgendeinProperty = True then
  ...
wird dann das Interface von Delphi automatisch wieder freigegeben?
Ja, das macht Delphi automatisch.
Ich kenne 3 Möglichkeiten dass die Referenzzählung nicht korrekt arbeitet:
1.) speichern von Interfacepointern in "normalen" Pointer.
Man muss mit AddRef nachhelfen, sonst wird das Objekt freigeben
Delphi-Quellcode:
var
   ob : Pointer;
   lg : ILogger;
begin
   lg := CoLogger.Create; // object erzeugen
   // RefCount ist 1
   lg._AddRef;
   // RefCount ist 2
   ob := lg;
end; // RefCount ist wieder 1
// Wenn nun der Pointer "ob" beschrieben wird ohne vorher ._Release aufzurufen
// hast du ein Speicherleck
2.) Manchmal implementiert man die Methoden _AddRef und _Release in eigenen Klassen, damit man
nicht von TInterfacedObject erben muss.
Wenn hier etwas falsch macht, ist die Referenzzählung ausser Kraft gesetzt -> Speicherleck
3.) Vermischung von Objekt- und Interfacereferenzen
Deine Objekte lassen sich in Objekt-Zeigern (abgeleitet von TObject) oder in Interfacezeigern
(abgeleitet von IUnknown) speichern.
Wenn man beim gleichen Objekt beide Arten anwendet, kommt man in Schwierigkeiten.
Andreas
  Mit Zitat antworten Zitat