关于记录 ,一句话问题 ( 积分: 50 )

  • 主题发起人 主题发起人 offline
  • 开始时间 开始时间
O

offline

Unregistered / Unconfirmed
GUEST, unregistred user!
请教包含动态数组的记录,应该怎么释放?
如:
TMyRecord=record
member1:integer;
member2:string;
aArray:array of integer;
end;
var
aMyRecord:TMyRecord;

释放aMyRecord时需要setLength(aMyRecord.aArray,0)吗?
谢谢!
 
请教包含动态数组的记录,应该怎么释放?
如:
TMyRecord=record
member1:integer;
member2:string;
aArray:array of integer;
end;
var
aMyRecord:TMyRecord;

释放aMyRecord时需要setLength(aMyRecord.aArray,0)吗?
谢谢!
 
aArray:=nil;
 
假如在函数里边,

procedure pro1;
var aMyRecord:TMyRecord;
begin
{
do something...
}
end;
这里的aMyRecord 不需要nil吧?
 
看你的动态数组怎么用了,如果要重复执行你的“函数”那就在动态数组初始化前把它nil掉~
 
record类型不能nil吧?
提示类型不匹配
 
记录不能释放。只能释放数组。
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TMyRecord=record
member1:integer;
member2:string;
aArray:array of integer;
end;

TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var Arr: TMyRecord;
begin
arr.member1:=20;
arr.member2:='20str';
setlength(arr.aArray,1);
arr.aArray[0]:=90;
showmessage(inttostr(arr.aArray[0]));
Initialize(arr.aArray);
If Arr.aArray<> nil then showmessage('OK');
end;

end.
 
动态数组是内存自管理类型,一般来说不用主动释放。
 
动态数组肯定要释放得,系统不自动管理
 
如真要自己管理,可用指针
type
MyPointer = ^TMyRecord;
TMyRecord=record
member1:integer;
member2:string;
aArray:array of integer;
end;

声明:
procedure pro1;
var
APointer :MyPointer

aMyRecord:TMyRecord;
begin
new(APointer)

aMyRecord.member1 :=10;
APointer :=@aMyRecord;
showmessage(inttostr(APointer.member1));
APointer :=nil;
.....//剩下代码不能再访问 APointer;
end;
 
Delphi本身有个TList类,管理指针数组的,可以参考其中的单元代码定义你自己的类型
 
我不同意offline的说法
在delphi中动态数组和字符串一样都是引用记数的,当引用为0时自动释放。
但是动态数据不支持copy-on-write技术

另外也可以手动释放,有两中方法,finalize过程或将动态数组名= nil
 
那还是要释放啊,让他长度等于0还不是要设setLength(dynArray,0)吗呵呵
 
后退
顶部