【问题标题】:Memory leak when assigning to a Record分配给记录时的内存泄漏
【发布时间】:2014-01-02 15:48:11
【问题描述】:

在尝试找出我们的一个新应用程序崩溃的原因时,我一直在追查 Delphi 中的内存泄漏问题。

我已经连接了最新版本的FastMM 并一直在研究结果,但对以下内容感到困惑,为简洁起见,我将其归结为基本内容。

我们有一个用 2 个字符串字段定义的记录。这些是从两个 TEdit 框分配的,同时我们将数据写入 TListView。这是关键代码:

procedure TForm1.SetAssignment;
var
   tp: TestPointer;
   SourceTable, SourceColumn: string;
   LI: TListItem;
begin
   SourceTable := Edit1.Text;
   SourceColumn := Edit2.Text;
   LI := lvTest.Items.Add;
   LI.Caption := SourceTable;
   LI.SubItems.Add(SourceColumn);
   new(tp);
   // Leak occurs here
   tp^.SourceTable := SourceTable;
   tp^.SourceField := SourceColumn;
   // No leak if preceding lines are ommitted
   TestList.Add(tp);
end;

问题似乎与SourceTable/SourceColumn 的值或tp^ 有关。价值观。

当我们相当时,TList 正在被正确清除:如果我们注释掉对tp^.SourceTable/tp^.SourceField 的分配,那么就没有内存泄漏。

可能只是因为过年了,但是看不到怎么放SourceTable/SourceColumn...

【问题讨论】:

  • 请出示清理TList的代码。您可能不会最终确定每条记录,因此编译器会释放其 String 成员。您也可以在释放记录本身之前将每个 String 成员设置为 ''
  • 另见Finalize
  • “TList 正在被正确清理” - 如果你找不到错误,那么盲目相信你的话和假设是没有意义的。错误的事实证明您的假设之​​一是错误的。所以-“怀疑一切”(c)笛卡尔。您引用了从new(tp);TestList.Add(tp); 的代码-不,请显示从undo TestList.Add(tp);undo new(tp) 的对应代码,让我们看看代码是否“正确| 用新鲜的眼光。您的代码不是“正确”-它泄漏了。这是开始挖掘的事实。所以 - 请显示实际代码。

标签: delphi delphi-xe5 fastmm


【解决方案1】:

我希望您的清理代码在指针上调用 FreeMem 而不是 Dispose。这是我能想象的唯一有这些症状的东西。 FreeMem 只是释放内存,但 Dispose 也会在释放前完成内容。

当您调用 Dispose 时,您必须提供一个正确类型的指针。对于您的情况,您必须将 TestPointer 传递给 Dispose。

【讨论】:

    猜你喜欢
    • 2013-10-16
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多