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


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




Class Methods aply to the class level, in other words you donґt need an instance to call the method

I wish we could define class objects as well, but they doesnґt exist in Object Pascal, so we will do a trick, we are going to define a variable in the implementation section of the unit, this variable will hold the number of instances the class will have in a moment in time. Object Oriented purist might claim about it, but it works, nobody is perfect (not even Delphi!).

For example say you need to create instances of a class named TFoo, so you create the following Unit.

We will define two class procedures: AddInstance(to increse the counter of instances) and ReleaseInstance(to decrese the number of instances), these are called in the constructor and the destructor acordingly. Finally we define a class function NumOfInstances which returns the actual number of instances.

Add a Initilialization and a Finalization section to the Unit, in the Finalization section ask if the number of instances is <> 0, if this is the case you known that you didinґt destroy all the objects that you created.

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
//end of TFoo.AddInstance

constructor
 TFoo.Create;
begin

  AddInstance;
end
//end of TFoo.Create

destructor
 TFoo.Destroy;
begin

  ReleaseInstance;
  inherited
;
end
//end of TFoo.Destroy

class
 function TFoo.NumOfInstances: Integer;
begin

  Result := TFoo_Instances;
end
//end of TFoo.NumOfInstances

class
 procedure TFoo.ReleaseInstance;
begin

  Dec(TFoo_Instances);
end
//end of TFoo.ReleaseInstance

initialization


finalization


  if
 TFoo_Instances <> 0 then
    MessageBox(0
,
      PChar(Format('%d instances of TFoo active'
, [TFoo_Instances])),
      'Warning'
, MB_OK or MB_ICONWARNING);

end
.


Взято с Delphi Knowledge Base
http://www.baltsoft.com/







DELPHI FAQ




EOMY TOP 100      Рейтинг@Mail.ru      Rambler's Top100