Использование классовых методов для выявления утечек памяти

Материал из DRKB


Классовые методы применимы прямо из класса, то есть нет необходимости создавать экземпляр при помощи конструктора.

Хотелось бы определить еще и классовые переменные, но их не существует в Object Pascal, поэтому определим переменную в секции implementation модуля программы. Эта переменная будет содержать количество экземпляров класса на данный момент времени.

Определим две классовые процедуры: AddInstance (увеличение счетчика экземпляров) и ReleaseInstance (уменьшение счетчика экземпляров). Они будут вызываться конструктором и деструктором соответственно. И еще одну классовую функцию NumOfInstances, которая вернет текущее количество экземпляров.

Добавим секции initilialization и finalization. В секции iinalization проверяем количество экземпляров, и если <> 0, значит не все созданные экземпляры были освобождены.


unit U_Foo;

interface

uses
  Classes, Windows, SysUtils;

type
  TFoo = class
  private
    class procedure AddInstance;
    class procedure ReleaseInstance;
  public
    constructor Create;
    destructor Destroy; override;
    class function NumOfInstances: Integer;
  end;

implementation

var
  TFoo_Instances: Integer = 0;

  { TFoo }

class procedure TFoo.AddInstance;
begin
  Inc(TFoo_Instances);
end;

constructor TFoo.Create;
begin
  AddInstance;
end;

destructor TFoo.Destroy;
begin
  ReleaseInstance;
  inherited;
end;

class function TFoo.NumOfInstances: Integer;
begin
  Result := TFoo_Instances;
end;

class procedure TFoo.ReleaseInstance;
begin
  Dec(TFoo_Instances);
end;

initialization

finalization

  if TFoo_Instances <> 0 then
    MessageBox(0, PChar(Format('%d экземпляров of TFoo активно', [TFoo_Instances])),
      'Предупреждение', MB_OK or MB_ICONWARNING);

end.


Source: Delphi Knowledge Base: http://www.baltsoft.com/
ID: 04529