类、接口、记录、动态数组的内存释放问题,当做参数和返回值的时候 释放问题...

本文探讨了类、接口、记录及动态数组等不同数据结构在作为返回值时的内存管理策略,通过具体的Delphi代码示例展示了这些数据结构的创建与释放过程。

类 --- 手工创建与释放

接口 --- 根据引用计数增加和减少 为0时释放。

记录 ---- 就是一组基本类型的组合,自动创建和释放。

动态数组 --- 独特的一套自动释放策略,可以看下图汇编代码,指针出栈时 自动释放。

 

 

当做参数的时候的释放问题,理解了,那么当做返回值的时候是如何释放的呢。

 

类、接口、记录、动态数组 当被作为返回值的时候 都是与其自身原来的释放策略一样的特性。

 

 

 

 

 

unit Unit4;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm4 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form4: TForm4;

implementation

{$R *.dfm}

function abc1(): TStringList;
begin
  Result := TStringList.Create;
  Result.Add('QDAC');
end;

procedure abc2(var aList: TStringList);
begin
  aList.Add('QDAC');
end;

procedure abc3(out aList: TStringList);
begin
  aList := TStringList.Create;
  aList.Add('QDAC');
end;

procedure TForm4.Button1Click(Sender: TObject);
var
  list1, list2, list3: TStringList;
begin
  list1 := abc1();

  list2 := TStringList.Create;
  abc2(list2);

  abc3(list3);

  Memo1.Lines.Add('list1 ' + list1.Text);
  Memo1.Lines.Add('list2 ' + list2.Text);
  Memo1.Lines.Add('list3 ' + list3.Text);

  list1.Free;
  list2.Free;
  list3.Free;
end;

procedure TForm4.FormCreate(Sender: TObject);
begin
  ReportMemoryLeaksOnShutdown := True;
end;

end.

 

转载于:https://www.cnblogs.com/del88/p/6693655.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值