Delphi 为什么在调用Dispose之前必须强制转换到特定的指针类型?

Delphi 为什么在调用Dispose之前必须强制转换到特定的指针类型?,delphi,pointers,casting,dispose,Delphi,Pointers,Casting,Dispose,假设我有一个TList类的实例(BDS2006,这是指针类型的列表)。我放入列表中的每个指针都引用New()函数分配的内存。所以当我想清除列表时,我必须遍历它并处理每个项目,对吗?但如何正确地做到这一点呢?我是否必须将每个已处理项转换为实际类型 type TMyRec = record Field1: string; Field2: integer; end; PMyRec = ^TMyRec; ... var MyList: TList;

假设我有一个TList类的实例(BDS2006,这是指针类型的列表)。我放入列表中的每个指针都引用New()函数分配的内存。所以当我想清除列表时,我必须遍历它并处理每个项目,对吗?但如何正确地做到这一点呢?我是否必须将每个已处理项转换为实际类型

type
  TMyRec = record
    Field1: string;
    Field2: integer;
  end;
  PMyRec = ^TMyRec;

  ...

  var
    MyList: TList;
    MyRecPointer: PMyRec;
  begin
    ...
    New(MyRecPointer);
    ...
    MyList.Add(MyRecPointer);
    ...

    for i := 0 to MyList.Count - 1 do
      Dispose(PMyRec(MyList[x]));        

    MyList.Clear();
  end;
请看最后的for循环。我将每个项目强制转换到PMyRec以处理内存。有必要吗?我知道Dispose()函数有一个指针参数,所以在这种情况下强制转换看起来很愚蠢,但我仍然不确定。因为Dispose()函数在获得一般指针类型时如何知道要处理多少内存

这是第二种方法(无类型转换):


如果有人告诉我应该怎么做以及为什么,我将不胜感激。非常感谢。

是的,有必要转换到正确的指针类型。否则,RTL不知道该记录有字符串成员,因此不会处理该字符串。它将直接跳到释放记录自己的内存,字符串的内容将泄漏。它知道为记录释放多少内存,就像
FreeMem
知道从
GetMem
调用中释放多少内存一样。内存管理器知道分配给它的每个内存有多少。(有多种方法可以跟踪这一点。)


Dispose
是一个“编译器魔法”函数。当编译器看到您调用它时,它会为指针类型对应的
TTypeInfo
记录添加一个隐藏的第二个参数。这样,RTL的
Dispose
函数知道如何处理它接收到的指针。

谢谢,@Premature。下一次,你可以自己纠正明显的打字错误。
for i := 0 to MyList.Count - 1 do
  Dispose(MyList[x]);