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" для удаления юнитов, на которые нет ссылок

Другие вопросы по тегам