分配给记录时内存泄漏

时间:2014-01-02 15:48:12

标签: delphi delphi-xe5 fastmm

虽然试图解决为什么我们的一个新应用程序崩溃,但我一直在追踪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 ......

1 个答案:

答案 0 :(得分:3)

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

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