虽然试图解决为什么我们的一个新应用程序崩溃,但我一直在追踪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 ......
答案 0 :(得分:3)
我希望您的清理代码调用FreeMem而不是Dispose指针。这是我能想象的唯一有这些症状的东西。 FreeMem只释放内存,但Dispose也会在释放之前完成内容。
当您调用Dispose时,您必须提供正确键入的指针。对于您的情况,您必须将TestPointer传递给Dispose。