Delphi:如何释放动态创建的对象作为方法的参数

Art*_*tik 6 delphi free object

我有一个参数作为对象的方法(下面的sniped代码):

TMyObject=class(TObject)
  constructor Create();
  destructor Destroy();override;
end;

implementation

function doSomething(x:TMyObject):integer;
begin
  //code
end;

procedure test();
var
  w:integer;
begin
  w:=doSomething(TMyObject.Create);
  //here: how to free the created object in line above?
end;
Run Code Online (Sandbox Code Playgroud)

如何破坏在此方法之外的被调用方法doSomething中创建的对象?

Dal*_*kar 9

为了释放对象实例,您需要有一个可以调用它的引用Free().

由于您将作为参数就地创建对象实例,因此您将拥有的唯一引用是doSomething()参数内部的引用.

你要么必须在Free里面doSomething()(这是我不建议做的练习):

function doSomething(x: TMyObject): Integer;
begin
  try
    //code
  finally
    x.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

或者,您需要创建一个额外的变量test(),传递给它doSomething(),然后返回FreedoSomething():

procedure test();
var
  w: Integer;
  o: TMyObject
begin
  o := TMyObject.Create;
  try
    w := doSomething(o);
  finally
    o.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

虽然有人可能认为使用引用计数对象将允许您就地创建对象并让引用计数释放对象,但由于以下编译器问题,这种构造可能不起作用:

当直接将新创建的对象实例作为const接口参数传递时,编译器应保留隐藏引用

前Embarcadero编译工程师Barry Kelly在StackOverflow答案中证实了这一点:

编译器在将对象实例直接作为const接口参数传递时是否应该提示/警告?

  • 改变签名总是一个坏主意.但是使用`as`,它永远不会脆弱,无论有没有`const`. (3认同)