2007. november 21., szerda
Using class methods to detect Memory-Leaks
Problem/Question/Abstract:
When you dinamically create objects at runtime, you need to check that you free those objects too. Class methods can help in the process.
Answer:
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.
Feliratkozás:
Megjegyzések küldése (Atom)
Nincsenek megjegyzések:
Megjegyzés küldése