Delphi 为什么在调用Dispose之前必须强制转换到特定的指针类型?
假设我有一个TList类的实例(BDS2006,这是指针类型的列表)。我放入列表中的每个指针都引用New()函数分配的内存。所以当我想清除列表时,我必须遍历它并处理每个项目,对吗?但如何正确地做到这一点呢?我是否必须将每个已处理项转换为实际类型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;
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]);