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.