2009-08-13 2 views
7

FAstMM сообщает о памяти из TIdCriticalSection в IdStack.pas. Я понимаю, что это преднамеренная утечка, которая задокументирована в коде.Delphi: memoryleak в IdStack, но кто использует IdStack?

Что я не понимаю, почему IdStack включен в мой проект. Как я могу узнать, какой блок его втягивает?

Есть ли способ исключить эту утечку из отчета, используя версию fastmm, которая поставляется с delphi 2007?

UPDATE: Есть ли способ найти все pas-файлы, включенные в сборку?

ответ

4

Все блоки Indy имеют префикс 'Id', поэтому проверьте, есть ли у вас какие-либо из этих предложений.

Другим способом может быть размещение точки останова в TIdStack.create(). В конце концов, виновный появится в стеке вызовов.

+0

Я пробовал точки останова, но он никогда не ломается. Похоже, что секция инициализации/завершения - это единственный выполняемый код. Теперь я делаю массивную grep, чтобы увидеть, могу ли я что-нибудь найти. – Vegar

+0

Широкий grep нашел использованный блок! – Vegar

2

Посмотрите использованию в вашей .dpr Использование cnPack (cnPack.org) и выберите 'Использование чистых', чтобы удалить блоки не ссылается

+0

Другим вариантом для этого является Icarus, свободное подмножество анализатора Pascal: http://www.peganza.com/#ICARUS –

+0

wow. Выслушали о cnPack, но никогда не пробовали. Это нужно изменить! :-) Благодаря. – Vegar

8

менеджер памяти Delphi FastMM предоставляет метод

function RegisterExpectedMemoryLeak(P: Pointer): boolean; 

So , если вы нашли устройство, и оказалось, что вы не можете его удалить, вы можете использовать этот метод, чтобы подавить предупреждение о утечке памяти.

4

Существует много об этом в сети, хотя оно разбросано. Это зависит от того, используете ли вы Indy 9 (с D7) или позже. Это заслоняет меня тоже. Для Indy 9 я сделал следующее IdComponent.pas:

initialization 
    GStackCriticalSection := TCriticalSection.Create; 

    // BJF Starts 
    //RegisterExpectedMemoryLeak(GStackCriticalSection); 
    // BJF Ends 

finalization 
    // Dont Free. If shutdown is from another Init section, it can cause GPF when stack 
    // tries to access it. App will kill it off anyways, so just let it leak 

    // BJF has removed comments 
    FreeAndNil(GStackCriticalSection); 
end. 

Но обратите внимание, что вы должны установить путь к источнику Инди в пути к библиотеке. Я считаю, что Indy 10 зафиксирован в этом отношении. Brian

+0

Не удаляйте эти комментарии. Из-за этого многопоточное приложение может выйти из строя. Это глобальная переменная, и Windows в любом случае освободит память и ручки ядра (например, критические разделы). См. Эту ссылку и статьи, которые она ссылается на: http://blogs.msdn.com/b/oldnewthing/archive/2010/01/22/9951750.aspx –