【发布时间】:2012-06-01 20:19:43
【问题描述】:
根据 FastMM4,我目前正在处理的 Delphi 程序泄漏了很多字符串。 AnsiStrings 准确地说:
应用程序 (http://sourceforge.net/projects/orwelldevcpp/) 曾经泄漏更多其他数据类型,但 FastMM4 可以报告实例的创建位置,因此我设法解决了这个问题。奇怪的是,FastMM4 根本不报告这些泄漏的位置。
编辑:它似乎确实如此,请参阅修复的答案。无论如何,问题仍然存在:我到底是怎么泄露这些东西的?
所以,嗯,不幸的是,我不知道要寻找什么。我的意思是,如果这些东西超出范围,它们应该被自动释放(即使它们在堆上)?
我确实设法通过随机评论并查看计数会发生什么来追踪一些泄漏。这是一个例子:
// simply passing it a constant creates a leak...
MainForm.UpdateSplash('Creating extra dialogs...');
procedure TMainForm.UpdateSplash(const text : AnsiString);
begin
if not devData.NoSplashScreen then // even if this branch is NOT taken
SplashForm.Statusbar.SimpleText := 'blablabla' + text;
end;
// And even if the function call itself is placed within a NOT taken branch!
这是另一个泄漏示例:
// Passing this constants produces leaks...
procedure TCodeInsList.AddItemByValues(const a, b, c: AnsiString;...);
var
assembleditem : PCodeIns;
begin
new(assembleditem);
assembleditem^.Caption:=a;
assembleditem^.Line:=b;
assembleditem^.Desc:=c;
...
fList.Add(assembleditem);
end;
// ... even when calling this on WM_DESTROY!
destructor TCodeInsList.Destroy;
var
I: integer;
begin
for I := 0 to fList.Count - 1 do
Dispose(fList[I]);
fList.Free;
inherited Destroy;
end;
// produces leaks!?
这里有很多字符串泄漏问题,但没有一个真正阐明应该寻找什么模式。 Google 也不提供。
编辑:所以,我必须寻找传递的常量。但是为什么呢?
嗯,有什么想法吗?
【问题讨论】:
-
我目前无法加载 sourceforge 项目。是否有可能主要形式没有被正确破坏并因此留下悬垂的字符串?会这样吗?
-
德尔福版本?如果可以,请使用 aqtime 进行测试,它会告诉您确切的泄漏位置。
-
@RichardA:正如你在 source\devcpp.dpr 中看到的,splashform 是使用“Free”释放的。将尝试将 caFree 添加到 OnClose 事件中。
@Warren:我非常怀疑 aqtime 能否告诉我比 FastMM4、gpProfiler 和 MemCheck 更多的信息。而且我也需要为 aqtime 升级到 XE(现在使用 D7)。我的大学确实有一个 D2009 许可证在某个地方浮动(但不适用于像我这样的 EE 人),但 aqtime 似乎甚至不支持它。 -
aqtime 在旧的 delphi 版本上运行良好,但是是的,您必须购买它。 AQTime 通过 XE2 与 Delphi 7 一起运行。
标签: string delphi memory memory-leaks dev-c++