分配给记录时内存泄漏



在试图弄清楚为什么我们的一个新应用程序崩溃时,我一直在追查德尔福的内存泄漏。

我已经连接了最新版本的 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,那么就没有内存泄漏。

也许只是因为现在是新年,但我看不到我是如何发布源表/源列的......

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

调用 Dispose 时,必须提供正确键入的指针。对于您的情况,您必须通过测试指针才能释放。

相关内容

  • 没有找到相关文章

最新更新