Предположим, что приложение с некоторыми формами и только одним модулем данных создается при запуске. В событии 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;