いくつかのフォームを備えたアプリケーションがあり、開始時に1つのデータモジュールのみが作成されたとします。DM1.OnCreate
イベントでは、実行時に使用するためにaがTStringList
作成されます。アプリケーションが終了すると、すべてのものが破棄され、メモリが自動的に解放されることがわかっています。何かを解放するには時間がかかることがあるため、シャットダウン時のメモリリークについて常に心配することをお勧めします。たとえば、Barry Kellyからのこの回答、またはRaymondChenからのこの投稿を参照してください。
TStringList.Free
それに加えて、に追加しない場合、FastMMはメモリリークを報告しますDM1.OnDestroy
。これは、私が本当に心配すべき他のメモリリークを検索するときに問題になることがわかりました。
したがって、基本的には、アプリケーションまたはOS(この特定のケースではWindows)によって解放されるオブジェクトインスタンスを解放する必要があるかどうか、なぜ、いつ解放する必要があるかを尋ねています。メモリリークを探すときにない他の有効なケースはありますか?
注:この特定のケースでは、データモジュールは何度も作成または再作成されません。1つを除いて、メモリリークはまったくありません。データモジュールのスクラップソース:
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;