Delphi 如何管理为作为参数创建的对象分配的内存?

问题描述 投票:0回答:1

标题可能看起来有点令人困惑,但我问题的核心是:在以下两种情况下分配的内存会发生什么?

场景一:

var
 FHTTPResponse: IHTTPResponse;

...

FHTTPResponse := HTTPClient.Post(RequestURL, TStringStream.Create(APostParams.ToString, TEncoding.UTF8));

TStringStream
对象是在函数的参数列表中创建的(在本例中为
THTTPClient.Post
)。当我创建它时,分配给它的内存会发生什么,但(据我所知)我无法释放它。

场景2:

  ExampleClass = class
    private
      FName, FValue: string;
    public
      constructor Create(AName, AValue: string);

      function AsStringList: TStringList;
  end;

implementation

function ExampleClass.AsStringList: TStringList;
begin
  Result := TStringList.Create;
  Result.Add(FValue);
  Result.Add(FName);
end;

constructor ExampleClass.Create(AName, AValue: string);
begin
  FValue := AValue;
  FName := AName;
end;

当用户调用

ExampleClass.AsStringList
时,我的理解是我不会返回对对象的引用,就像我有一个字段
FAsStringList
那样,而是返回 对象本身

在这种情况下,我将传递释放

TStringList
对象的责任(这感觉是错误的)。在这个回报之下还有其他事情发生吗?是否有更好的方法以不同的结构返回数据,这并不意味着让用户有责任释放对象,而他们甚至不知道自己必须这样做?

TL;DR 是否有更好(或正确)的方法来将数据表示形式返回为不同的对象类型,而不将内存管理职责转移给用户?

delphi memory-management
1个回答
0
投票

Create
对象的任何调用都必须有对
Free
/
Destroy
对象的匹配调用,否则该对象将被泄漏。就这么简单。

并且,所有对象类型变量/参数/返回/等都是对对象的引用,而不是实际对象本身。 Delphi 中的对象不能按值传递,只能按引用传递。

© www.soinside.com 2019 - 2024. All rights reserved.