对象创建未分配给变量

问题描述

我想使用类的方法而不将其创建分配给变量。例如:

type
  TMyObject = class
  public
    procedure DoSomething;
  end;

implementation

procedure MyObjDoesSomething;
begin
  TMyObject.Create.DoSomething;
end;

{ TMyObject }

procedure TMyObject.DoSomething;
begin
  // ...
end;

如您所见,在MyObjDoesSomething中,我没有将TMyObject.Create分配给TMyObject变量。

这是否会对内存使用产生某种影响,甚至是我没有想到的其他事物?

解决方法

如果您Create为对象分配内存,则在使用完该对象以释放该内存时,必须在该对象上调用Free(),否则内存会泄漏,这将影响内存随着时间的推移,如果您多次创建这些对象。

如果您不想使用显式变量来引用对象(为什么?),则可以使用with块,例如:

procedure MyObjDoesSomething;
begin
  with TMyObject.Create do
  try
    DoSomething;
  finally
    Free;
  end;
end;

另一种选择是使类实现interface,然后可以让编译器的接口引用计数为您处理释放对象。这比上面有更多的开销,但是您不必担心手动处理内存,例如:

type
  IMyObject = interface
    ['{896FF4FA-A974-4A8B-9EA5-414C138635E4}']
    procedure DoSomething;
  end;

  TMyObject = class(TInterfacedObject,IMyObject)
  public
    procedure DoSomething;
  end;

implementation

procedure MyObjDoesSomething;
begin
  (TMyObject.Create as IMyObject).DoSomething;
end;

{ TMyObject }

procedure TMyObject.DoSomething;
begin
  // ...
end;

但是实际上,只需使用变量即可。它不花钱使用:

procedure MyObjDoesSomething;
var
  Obj;
begin
  Obj := TMyObject.Create;
  try
    Obj.DoSomething;
  finally
    Obj.Free;
  end;
end;
,

是的,影响很大:一次不错的内存泄漏!

您调用对象的构造函数,但从不释放创建的对象。每次调用MyObjDoesSomething时,都会泄漏对象实例。

要解决该问题,您可以制作一个DoSomething的类方法,如下所示:

type
  TMyObject = class
  public
    class procedure DoSomething;
  end;

然后您可以调用DoSomething,而无需创建这样的对象:

procedure MyObjDoesSomething;
begin
  TMyObject.DoSomething;
end;

作为类方法,DoSomething实现不能使用对象实例变量(字段)。