Этот код Delphi покажет утечку памяти для экземпляра TMyImplementation:
program LeakTest;
uses
Classes;
type
MyInterface = interface
end;
TMyImplementation = class(TComponent, MyInterface)
end;
TMyContainer = class(TObject)
private
FInt: MyInterface;
public
property Impl: MyInterface read FInt write FInt;
end;
var
C: TMyContainer;
begin
ReportMemoryLeaksOnShutdown := True;
C := TMyContainer.Create;
C.Impl := TMyImplementation.Create(nil);
C.Free;
end.
Если TComponent заменяется на TInterfacedObject и конструктор изменился на Create(), утечка исчезнет. Что здесь отличается от TComponent?
Большое спасибо за ответы. Подводя итог: легко, но неправильно, сказать: "Если вы используете интерфейсы, они подсчитываются, и поэтому они освобождаются для вас". - Фактически любой класс, который реализует интерфейс, может нарушить это правило. (И не будет указаний или предупреждений компилятора.)