Delphi: утечка памяти в IdStack, но кто использует IdStack?
FAstMM сообщает об утечке памяти из TIdCriticalSection в IdStack.pas. Я понимаю, что это преднамеренная утечка, которая задокументирована в коде.
Я не понимаю, почему IdStack включен в мой проект. Как я могу узнать, в какой блок его тянет?
Есть ли способ исключить эту утечку из отчета, используя версию fastmm, которая поставляется с delphi 2007?
ОБНОВЛЕНИЕ: есть ли способ найти все pas-файлы, включенные в сборку?
4 ответа
Все юниты Indy имеют префикс "Id", поэтому проверьте, есть ли у вас какие-либо из них в ваших предложениях использования.
Другим способом может быть размещение точки останова в TIdStack.create(). В конце концов, виновный появится в стеке вызовов.
Диспетчер памяти Delphi FastMM предоставляет метод
function RegisterExpectedMemoryLeak(P: Pointer): boolean;
Итак, если вы нашли устройство и оказалось, что вы не можете удалить его, вы можете использовать этот метод для подавления предупреждения об утечке памяти.
В интернете много всего об этом, хотя оно разбросано. Это зависит от того, используете ли вы 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 в пути к библиотеке. Я считаю, что Indy 10 исправлена в этом отношении. Брайан
Посмотрите на Uses в вашем.dpr Используйте cnPack (cnPack.org) и выберите "Uses Cleaner" для удаления юнитов, на которые нет ссылок