Delphi - 没有释放结构的字符串[FastMM manager]

时间:2009-07-29 19:36:34

标签: delphi string memory-management pointers fastmm

如果我宣布

PSomeStruct = ^TSomeStruct;
TSomeStruct = record 
  s1 : string;
end;

我运行以下代码:

var
  p: PSomeStruct;
begin
  new(p);
  p^.s1:= 'something bla bla bla';
  dispose(p);

FastMM 4内存管理器报告存在内存泄漏(类型:字符串,数据转储:“bla bla bla”)。但是,如果我在调用dispose之前将s1字符串设置为空,那就没关系。

我找到的第二种方法是从记录类型更改为类,然后而不是new我正在创建实例,而不是dispose我正在调用instance.Free()。无需手动清洁琴弦即可正常工作。

当我致电dispose时,有没有办法让Delphi自动清理字符串?

2 个答案:

答案 0 :(得分:1)

你已经做了正确的事情。如果FastMM说字符串已泄漏,那么FastMM是错误的,或者它报告的字符串与您认为的字符串不同。 Dispose过程从记录中释放字符串。

在这种特殊情况下,无论如何都不应该为该字符串分配任何内存。它是一个字符串文字,所以我希望编译器分配该文字;它的引用计数应为-1,而FastMM从未见过它。

答案 1 :(得分:1)

FastMM是你的.dpr中使用的第一个单元吗?否则它可能太早确定,报告错误的记忆泄漏。

这个简化的代码示例是否也会产生与使用JvSimpleXML时相同的内存泄漏?如果不是,那么你可能还会有更多的事情发生。

在我看来:当FastMM报告内存泄漏时,会出现内存泄漏。