小编Art*_*ujo的帖子

在Delphi中,在事件中释放发送者是正确的方法吗?

所以,假设我们有一个这样的类:

  TFieldsReadyEvent = procedure(Sender: TObject; Code, AuthorizatedID: string) of object;
  TCatcherServer = class(TServer)
  private
    FOnFieldsReady: TFieldsReadyEvent;
    FCode: string;
    FAuthoID: string;
    FAuthorizationType: TAuthorizationType;
    function GetAuthorizationType: string;
    function GetCode: string;
    function GetEntityID: string;
  public
    property OnFieldsReady: TFieldsReadyEvent read FOnFieldsReady write FOnFieldsReady;
    property Code: string read GetCode;
    property EntityID: string read GetEntityID;
    property AuthorizationType: string read GetAuthorizationType;
    procedure Callback(Session: TIdContext; Req: TIdHTTPRequestInfo; Res: TIdHTTPResponseInfo); override;
  end;
Run Code Online (Sandbox Code Playgroud)

程序Callback如下所示:

procedure TCatcherServer.Callback(Session: TIdContext;
  Req: TIdHTTPRequestInfo; Res: TIdHTTPResponseInfo);
begin
  inherited Callback(Session, Req, Res);
  if (Req.Params.Values['code'] …
Run Code Online (Sandbox Code Playgroud)

delphi pascal

2
推荐指数
1
解决办法
148
查看次数

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

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

场景一:

var
 FHTTPResponse: IHTTPResponse;

...

FHTTPResponse := HTTPClient.Post(RequestURL, TStringStream.Create(APostParams.ToString, TEncoding.UTF8));
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

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

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

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

delphi memory-management

1
推荐指数
1
解决办法
99
查看次数

标签 统计

delphi ×2

memory-management ×1

pascal ×1