加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 03:33:59 所属栏目:大数据 来源:网络整理
导读:我们假设我有一个TList类的实例(BDS 2006,所以这是一个指针类型的列表).放入列表的每个指针引用New()函数分配的内存.所以当我想清除列表时,我必须遍历它并处理每个项目,对吧?但如何正确地做到这一点?我必须将每个处理的物品投放到实际的类型上吗? type TM
我们假设我有一个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函数就知道如何处理它接收到的指针.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读