如果我宣布
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自动清理字符串?
答案 0 :(得分:1)
你已经做了正确的事情。如果FastMM说字符串已泄漏,那么FastMM是错误的,或者它报告的字符串与您认为的字符串不同。 Dispose
过程从记录中释放字符串。
在这种特殊情况下,无论如何都不应该为该字符串分配任何内存。它是一个字符串文字,所以我希望编译器分配该文字;它的引用计数应为-1
,而FastMM从未见过它。
答案 1 :(得分:1)
FastMM是你的.dpr中使用的第一个单元吗?否则它可能太早确定,报告错误的记忆泄漏。
这个简化的代码示例是否也会产生与使用JvSimpleXML时相同的内存泄漏?如果不是,那么你可能还会有更多的事情发生。
在我看来:当FastMM报告内存泄漏时,会出现内存泄漏。