type
TSomeRecord = Record
field1: integer;
field2: string;
field3: boolean;
End;
var
SomeRecord: TSomeRecord;
SomeRecAr: array of TSomeRecord;
Run Code Online (Sandbox Code Playgroud)
这是我所拥有的最基本的例子,因为我想重复使用SomeRecord(某些字段保持为空,没有释放所有字段将在重复使用时被转移SomeRecord,这显然是不受欢迎的)我正在寻找一种方法一次释放所有字段.我已经开始string[255]使用ZeroMemory(),这很好,直到它开始泄漏内存,这是因为我切换到string.我仍然缺乏了解原因的知识,但似乎与动态有关.我也在使用动态数组,因此我认为尝试ZeroMemory()任何动态都会导致泄漏.有一天浪费了这一点.我想,我通过使用解决了这个Finalize()上SomeRecord或SomeRecAr之前ZeroMemory(),但我不知道这是正确的做法,或只是我太傻了.
所以问题是:如何一次性解放所有东西?是否存在一些我不知道的单一程序?
换句话说,或者我会建议如何以不同的方式实现这些记录,所以我不需要做出复杂的尝试来释放东西.我已经研究过创建记录New()然后去掉它Dispose(),但我不知道当调用之后的变量Dispose()是未定义的而不是nil 时它意味着什么.另外,我不知道某个type(SomeRecord: TSomeRecord)的变量与指向type()的变量之间的区别是什么SomeRecord: ^TSomeRecord.我现在正在调查上述问题,除非有人能够快速解释,否则可能需要一些时间.
假设您有一个您想要初始化的本地记录:
type
TMyRec=record
Val1, Val2:Integer;
end;
procedure MyProc;
var
MyVar:TMyRec;
begin
// ... ?
WriteLn(Val1,Val2);
end;
Run Code Online (Sandbox Code Playgroud)
除了"手动"设置每个字段外,还有几种方法可以实现.
使用Initialize():
Initialize(MyVar);
Run Code Online (Sandbox Code Playgroud)使用默认值():
MyVar := Default(TMyVar);
Run Code Online (Sandbox Code Playgroud)使用FillChar:
FillChar(MyVar,SizeOf(MyVar),0);
Run Code Online (Sandbox Code Playgroud)定义一个空常量,并将其赋值给var
const cMyVar:TMyVar=();
...
MyVar := cMyVar;
Run Code Online (Sandbox Code Playgroud)以上所有似乎都适用于这个例子.我想你甚至可以定义一个全局变量来初始化它.
但是有一种首选方法吗?或者在某些情况下,不建议使用上述任何一种情况,或者它根本不起作用?
把它短,有什么明确的正确方法TM初始化一个局部堆栈变量?:-)