【问题标题】:Delphi - structures' strings not being freed [FastMM manager]Delphi - 未释放结构的字符串 [FastMM 管理器]
【发布时间】:2010-11-15 05:03:02
【问题描述】:

如果我声明

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()。它无需手动清理字符串即可工作。

当我调用dispose 时,有没有办法让Delphi 自动清理我的字符串?

【问题讨论】:

    标签: delphi string memory-management pointers fastmm


    【解决方案1】:

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

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

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

    【讨论】:

    • 是的,这是第一个。它与 JvSimpleXML 有关,如果我从字面上分配任何字符串(例如来自 TEdit.Text 的字符串),它也会泄漏内存:/
    【解决方案2】:

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

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

    【讨论】:

    • 好吧,为了让我的想法更清楚,我作弊了一点。事实上,字符串是从 JvSimpleXML 加载的,但是我确定它与报告的字符串相同,因为我检查了它 - 在“处理”之前将记录中的所有字符串字段设置为空,这会使内存泄漏报告消失。 .
    • D7:我有过一些 FastMM 对类似情况的抱怨——那些本应通过记录完成清理但被报告为泄漏的东西。 FastMM 可能有一个只适用于这类事情的错误似乎很奇怪,我更倾向于怀疑编译器错误,因为公共元素一直是应该通过记录终结来清理的东西。
    • 好吧,打开“调试 DCU”并逐步完成Dispose 调用。应该打电话给_FinalizeArray,那应该打电话给_LStrClr。如果是编译器的bug,那肯定是在生成TTypeInfo数据记录的时候,如果错了,那么New的代码也是错的。你会有未初始化的字符串字段的危险。
    猜你喜欢
    • 2014-12-13
    • 1970-01-01
    • 2013-11-14
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-10
    • 1970-01-01
    相关资源
    最近更新 更多