Есть ли, помимо поиска утечек памяти, другая ситуация, когда я должен освобождать все объекты при уничтожении приложения?

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

8
задан Community 23 May 2017 в 12:09
поделиться