Предположим, приложение с некоторыми формами и только один модуль данных создается при запуске. В событии DM1.OnCreate
создается TStringList
для использования во время выполнения. Мы знаем, что при завершении работы приложения все будет уничтожено, а память автоматически освободится. Освобождение чего-либо может занять некоторое время, поэтому не всегда рекомендуется беспокоиться об утечках памяти при завершении работы. См., Например, этот ответ Барри Келли или этот пост от Раймонда Чена.
Кроме того, FastMM сообщает об утечке памяти, если я не добавляю TStringList.Free
к DM1.OnDestroy
. Это оказывается проблемой при поиске любых других утечек памяти, о которых я должен действительно беспокоиться.
Итак, в основном я спрашиваю, следует ли / почему / когда мне освобождать экземпляры объектов, которые будут освобождены приложением или ОС (Windows в данном конкретном случае). Есть ли другой допустимый случай, которого нет при поиске утечек памяти?
ПРИМЕЧАНИЕ. В этом конкретном случае модуль данных не создается и не воссоздается несколько раз. Никакой утечки памяти, кроме одной, не будет. Источник лома модуля данных:
unit UDM1;
interface
uses SysUtils, Classes, ...;
type
TDM1 = class(TDataModule)
procedure DataModuleCreate(Sender: TObject);
procedure DataModuleDestroy(Sender: TObject);
procedure DoStuffWithStringList1(Sender: TObject);
private
internalStL: TStringList;
end;
var
DM1: TDM1;
implementation
procedure TDMInterfacePAFECF.DataModuleCreate(Sender: TObject);
begin
internalStL := TStringList.Create();
end;
procedure TDMInterfacePAFECF.DataModuleDestroy(Sender: TObject);
begin
internalStL.Free; //<-- IS THIS NECESSARY OR ADVISED?
end;
procedure DoStuffWithStringList(Sender: TObject);
begin
//Place some code using internalStL here...
end;