コンストラクタとデストラクタ

クラス、クラスインスタンス、コンストラクタ、デストラクタ

上記のサンプルには TAnimal とサブクラス TDog が含まれています。クラスは単なる型であり、テンプレートと捉えられます。クラス自身はデータを保持せず、サンプル内のフィールド MyInt: Integer にメモリは割り当てられません。

クラス変数を使用するとクラス自身にデータを持たせられますが、ここでは割愛し、通常のフィールドを持つ標準的なクラスのみ解説します。

フィールドにメモリを割り当てるにはクラスインスタンスを作成する必要があり、インスタンス作成時にはコンストラクタを呼び出します。

インスタンスを作成しない限り、クラスのコードは存在しないも同然で実行されず、変数にメモリも割り当てられません。クラスは金型のようなもので、使用するタイミングのみメモリが確保され、未使用時はリソースを消費せず静かに存在します。

コンストラクタ

  • キーワード constructor で宣言する特殊メソッド;
  • システムが先にオブジェクトのメモリを確保した後、コンストラクタのコードを実行;
  • 全てのクラスは暗黙的に TObject を継承し、引数なしコンストラクタ Create が標準搭載。手動定義なしでも利用可能;
  • カスタムコンストラクタはオブジェクト初期化の最善策で、フィールドに初期値を代入可能;
  • カスタムコンストラクタは慣例的に Create と命名します。

サンプルコード

program Demo;
{$ifdef FPC} {$mode objfpc}{$H+}{$J-} {$endif}
{$ifdef MSWINDOWS} {$apptype CONSOLE} {$endif}
{$codepage utf8}
uses SysUtils;

type
  TAnimal = class
  private
    InternalStuff: TObject;
  public
    constructor Create;
    destructor Destroy; override;
  end;

constructor TAnimal.Create;
begin
  inherited Create; // 先に親クラスのコンストラクタを呼び出す
  InternalStuff := TObject.Create;
  Writeln('TAnimal.Create コンストラクタを実行');
end;

destructor TAnimal.Destroy;
begin
  Writeln('TAnimal.Destroy デストラクタを実行');
  FreeAndNil(InternalStuff); // 内部サブオブジェクトを解放
  inherited Destroy; // 末尾で親クラスのデストラクタを呼び出す
end;

var
  C: TAnimal;
begin
  C := TAnimal.Create;
  try
    // オブジェクトを使用
  finally
    FreeAndNil(C); // Destroy デストラクタを自動呼び出し
  end;
end.

実行出力

D:\fpcdemo>fpc mydemo.dpr
Free Pascal Compiler version 3.2.2 [2021/05/15] for i386
Copyright (c) 1993-2021 by Florian Klaempfl and others
Target OS: Win32 for i386
Compiling mydemo.dpr
Linking mydemo.exe
38 lines compiled, 0.1 sec, 68672 bytes code, 4260 bytes data

D:\fpcdemo>mydemo
TMyClass.Create コンストラクタを実行
TMyClass.Destroy デストラクタを実行Code language: CSS (css)

InternalStuff はクラス内部が保持するサブオブジェクトです。コンストラクタで生成し、デストラクタ内で FreeAndNil により解放し、メモリリークを防止する必要があります。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です