相关疑难解决方法(0)

如何在Delphi中正确释放包含各种类型的记录?

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()SomeRecordSomeRecAr之前ZeroMemory(),但我不知道这是正确的做法,或只是我太傻了.

所以问题是:如何一次性解放所有东西?是否存在一些我不知道的单一程序?

换句话说,或者我会建议如何以不同的方式实现这些记录,所以我不需要做出复杂的尝试来释放东西.我已经研究过创建记录New()然后去掉它Dispose(),但我不知道当调用之后的变量Dispose()是未定义的而不是nil 时它意味着什么.另外,我不知道某个type(SomeRecord: TSomeRecord)的变量与指向type()的变量之间的区别是什么SomeRecord: ^TSomeRecord.我现在正在调查上述问题,除非有人能够快速解释,否则可能需要一些时间.

delphi records

15
推荐指数
3
解决办法
1万
查看次数

Initialize(),Default()和FillChar()之间的区别

假设您有一个您想要初始化的本地记录:

type 
  TMyRec=record
    Val1, Val2:Integer;
  end;

procedure MyProc;
var
  MyVar:TMyRec;
begin
  // ... ?

  WriteLn(Val1,Val2);
end;
Run Code Online (Sandbox Code Playgroud)

除了"手动"设置每个字段外,还有几种方法可以实现.

  1. 使用Initialize():

    Initialize(MyVar);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用默认值():

    MyVar := Default(TMyVar);
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用FillChar:

    FillChar(MyVar,SizeOf(MyVar),0);
    
    Run Code Online (Sandbox Code Playgroud)
  4. 定义一个空常量,并将其赋值给var

    const cMyVar:TMyVar=();  
    ...    
    MyVar := cMyVar;    
    
    Run Code Online (Sandbox Code Playgroud)

以上所有似乎都适用于这个例子.我想你甚至可以定义一个全局变量来初始化它.

但是有一种首选方法吗?或者在某些情况下,不建议使用上述任何一种情况,或者它根本不起作用?

把它短,有什么明确的正确方法TM初始化一个局部堆栈变量?:-)

delphi initialization

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

标签 统计

delphi ×2

initialization ×1

records ×1