Я передаю созданный объект конструктору другого объекта, которому нужен интерфейс, который реализует этот объект.Передача ссылки объекта в качестве интерфейса
ISomeInterface = interface
['{840D46BA-B9FB-4273-BF56-AD0BE40AA3F9}']
end;
TSomeObject = class(TInterfacedObject, ISomeinterface)
end;
TSomeObject2 = class
private
FSomeInterface: ISomeinterface;
public
constructor Create(SomeObject: ISomeInterface);
end;
var
Form1: TForm1; // main form
SomeObject: TSomeObject;
constructor TSomeObject2.Create(SomeObject: ISomeInterface);
begin
FSomeInterface := SomeObject;
end;
// main form creating
procedure TForm1.FormCreate(Sender: TObject);
var SomeObject2: TSomeObject2;
begin
SomeObject := TSomeObject.Create;
// SomeObject2 := TSomeObject2.Create(nil); // ok
SomeObject2 := TSomeObject2.Create(SomeObject); // not ok
try
// do some things
finally
SomeObject2.Free;
end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
SomeObject.Free; // if passed to a SomeObject2 Constructor - freeing it causing av
end;
После закрытия основной формы это дает мне AV и утечку памяти - вся основная форма просочилась. Если я прохожу nil
в конструктор TSomeObject
, все в порядке. Является компилятором, освобождающим FSomeInterface
подсчетом ссылок, и я не должен пытаться освободить SomeObject
в mainForm destructor
? Как я могу избежать этого?
Это то, что происходит, если вы смешиваете объект и inteface ссылки ... может вызвать очень неприятные ошибки. – jpfollenius