4

如果我声明

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

我运行以下代码:

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

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

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

有没有办法让 Delphi 在我打电话时自动清理我的字符串dispose

4

2 回答 2

1

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

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

于 2009-07-29T20:10:46.953 回答
1

FastMM 是 .dpr 中使用的第一个单位吗?否则它可能会过早地完成,报告错误的内存泄漏。

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

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

于 2009-07-30T06:51:11.623 回答