0

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

4

1 回答 1

3

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

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

于 2014-01-02T18:27:24.417 回答