【发布时间】:2013-04-22 19:03:27
【问题描述】:
我将创建的对象传递给另一个对象的构造函数,该对象需要该对象实现的接口。
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 并且我不应该尝试在 mainForm destructor 中释放 SomeObject?如何避免?
【问题讨论】:
-
如果你混合对象和接口引用会发生这种情况......可能会导致非常讨厌的错误。
标签: delphi oop interface delphi-7