2013-03-23 33 views
1

讓我們開始下D2010 codded簡單的代碼:如何RegisterExpectedMemoryLeak

var 
    StringList: TStringList; 
begin 
    ReportMemoryLeaksOnShutdown := True; 
    StringList := TStringList.Create; 
    StringList.LoadFromFile('c:\fateh.txt'); 
    RegisterExpectedMemoryLeak(StringList); 

FastMM4甚至Addr(StringList)爲參數 所以如何註冊預計MemoryLeak爲什麼坐在上面沒有按方法」一次又一次地報告內存泄漏t提前致謝 。

回答

2

您只註冊了字符串列表對象的泄漏。您還需要註冊您正在泄漏字符串列表擁有的所有對象。在這種情況下,它擁有string對象的StringList.Count實例。內存管理器不知道這些字符串是由字符串列表對象擁有的,因此也會被泄漏。

說起來容易做起來難。因爲你需要找到表示字符串的內存塊的開始。這與字符串的第一個字符有一個固定的偏移量,偏移量取決於您使用的是哪個Delphi版本。

在Unicode Delphi中,在32位代碼中,偏移量是12個字節。所以下面將註冊泄漏的字符串:

for i := 0 to StringList.Count-1 do 
    if StringList[i]<>'' then 
    RegisterExpectedMemoryLeak(PByte(StringList[i])-12); 

即使你這樣做,你仍然會得到兩個報告的內存泄漏。其中至少有一個由字符串列表TStringList.FList擁有的動態數組解釋。如果你想註冊這個漏洞,那麼你需要做更多的黑客攻擊,因爲你必須依賴實現細節來確定數組的存儲位置。

+0

這比我第一次看到感謝的大衛想的要複雜一點。 – 2013-03-23 11:13:11

+0

也許你可以寫一個'TLeakyStringList'來使用它的內部知識來註冊它自己。這是如何OOP? ;-) – 2013-03-24 12:41:46