在试图弄清楚为什么我们的一个新应用程序崩溃时,我一直在追查德尔福的内存泄漏。
我已经连接了最新版本的 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 时,必须提供正确键入的指针。对于您的情况,您必须通过测试指针才能释放。