在试图找出我们的一个新应用程序崩溃的原因时,我一直在追查 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是怎么放出来的……