根据 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!?
这里有很多字符串泄漏问题,但没有一个真正阐明应该寻找什么模式。谷歌也不提供。
编辑:所以,我必须寻找传递的常量。但为什么?
所以嗯,有什么想法吗?