根據FastMM4,目前我正在處理的Delphi程序正在泄漏很多字符串。 AnsiStrings準確地說:Delphi應用程序泄露AnsiStrings
應用(http://sourceforge.net/projects/orwelldevcpp/)用於泄露了很多其他數據類型,但FastMM4可以報告實例被創建在哪裏,所以我設法解決這個問題。奇怪的是,FastMM4根本沒有報告這些泄漏的位置。
編輯:看來它畢竟看到修復的答案。無論如何,這個問題依然存在:我在這個世界上如何泄漏這些東西?
所以,EHM,不幸的是,我有不知道要尋找什麼。我的意思是,如果這些東西超出範圍,它們應該被自動釋放(即使它們在堆上)?
我還是設法追蹤幾泄漏下降隨機評論,看會發生計數什麼。這裏有一個例子:
// 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也不提供。
編輯:所以,我必須尋找通過常量。但爲什麼?
所以EHM,任何想法?
我目前無法加載sourceforge項目。有沒有可能的主要形式沒有被正確銷燬,從而留下懸掛的字符串?會這樣做嗎? –
delphi版本?如果可以的話,使用aqtime進行測試,它會告訴你究竟在哪裏泄漏。 –
@RichardA:正如你可以在source \ devcpp.dpr中看到的,splashform是使用'Free'釋放的。將嘗試添加caFree到OnClose事件。 @沃倫:我非常懷疑aqtime能告訴我比FastMM4,gpProfiler和MemCheck更多。我也需要升級到XE的aqtime(現在使用D7)。我的大學確實有一個D2009許可證(但不是像我這樣的EE人),但aqtime甚至不支持它看起來。 –
Orwell