Относительно того, почему TObject.Free
выполняет много, каждый раз, когда объект уничтожается, любой объект, этот метод будет вызван. Все классы являются производными от TObject, это общий предок, поэтому практически любое действие в программе на Delphi включает в себя большое количество пар создания / уничтожения объектов и, следовательно, достигает TObject.Free
.
Что касается обнаружения утечек памяти, у вас есть все необходимое для решения этой проблемы в Delphi. Диспетчер памяти FastMM можно запустить в режиме «отчета об утечках памяти», и он предоставит вам множество диагностических данных для любой утечки памяти.
Рассмотрим следующую тривиальную программу:
program Leaker;
begin
ReportMemoryLeaksOnShutdown := True;
TObject.Create;
end.
Это приводит к следующему выводу:
Вам просто нужно установить ReportMemoryLeaksOnShutdown
на True где-то в вашем приложении (начало файла .dpr такое же хорошее место, как и любое другое).
Если вы хотите получить больше информации в отчете, вы можете загрузить полную версию FastMM и настроить ее так, как вам хочется.
Тогда вы получите такой вывод:
A memory block has been leaked. The size is: 84
This block was allocated by thread 0x1304, and the stack trace (return addresses) at the time was:
40455E [System][System.@GetMem]
405A2F [System][System.TObject.NewInstance]
40602E [System][System.@ClassCreate]
4474C2 [Classes][Classes.TStringList.Create]
C275A3 [Main.pas][Main][Main.TMainForm.CreateAuxiliaryForms][997]
C84C8A [OrcaFlex.dpr][OrcaFlex][OrcaFlex.OrcaFlex][351]
75E633CA [BaseThreadInitThunk]
77519ED2 [Unknown function at RtlInitializeExceptionChain]
77519EA5 [Unknown function at RtlInitializeExceptionChain]
The block is currently used for an object of class: TStringList
Это действительно замечательно. Это говорит мне о том, что утечка памяти была выделена в строке Main.pas 997, и именно туда я и положил свою преднамеренную утечку!