delphi – 为什么在调用Dispose之前必须转换为特定的指针类型?

前端之家收集整理的这篇文章主要介绍了delphi – 为什么在调用Dispose之前必须转换为特定的指针类型?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我们假设我有一个TList类的实例(BDS 2006,所以这是一个指针类型的列表).放入列表的每个指针引用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()函数获取一般的指针类型时,会如何知道要处理多少内存?

这是第二种方法(无类型铸造):

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

如果有人向我解释如何做到这一点,为什么,我将不胜感激.非常感谢.

解决方法

是的,必须将其转换为适当的指针类型.没有这个,RTL不知道记录有一个字符串成员,所以它不会处理字符串.它将直接跳过释放记录自己的内存,并且字符串的内容将泄漏.它知道有多少内存释放记录与FreeMem相同的方式知道从GetMem调用释放多少.内存管理器知道每个分配有多少内存. (有各种各样的方法来跟踪.)

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

猜你在找的Delphi相关文章