根据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也没有提供相关信息。
编辑:所以,我必须寻找传递的常量。但是为什么?
那么,有任何想法吗?