【发布时间】:2014-01-02 15:48:11
【问题描述】:
在尝试找出我们的一个新应用程序崩溃的原因时,我一直在追查 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...
【问题讨论】:
-
请出示清理
TList的代码。您可能不会最终确定每条记录,因此编译器会释放其 String 成员。您也可以在释放记录本身之前将每个 String 成员设置为''。 -
另见Finalize
-
“TList 正在被正确清理” - 如果你找不到错误,那么盲目相信你的话和假设是没有意义的。错误的事实证明您的假设之一是错误的。所以-“怀疑一切”(c)笛卡尔。您引用了从
new(tp);到TestList.Add(tp);的代码-不,请显示从undo TestList.Add(tp);到undo new(tp)的对应代码,让我们看看代码是否“正确| 用新鲜的眼光。您的代码不是“正确”-它泄漏了。这是开始挖掘的事实。所以 - 请显示实际代码。
标签: delphi delphi-xe5 fastmm