xHarbour Reference Documentation > Statement Reference |
Declares a method to be called by the garbage collector.
DESTRUCTOR <MethodName>
The DESTRUCTOR statement can only be used within the class declaration between CLASS and ENDCLASS. It declares a method that is automatically called when an object becomes subject to garbage collection. This is the case when there is no memory variable left holding a reference to an object.
The implementation of the destructor method must follow the ENDCLASS statement and must use the PROCEDURE statement, rather than METHOD. This is required since a destructor method cannot have a return value. The implementation of a destructor method follows this coding pattern:
PROCEDURE <MethodName> CLASS <ClassName> <cleanup code> RETURN
Destructor methods provide a convenient way of explicitely "cleaning up" memory or calling maintenance routines, like closing open files managed by an object.
See also: | CLASS, ERROR HANDLER, PROCEDURE |
Category: | Class declaration , Declaration , xHarbour extensions |
Header: | hbclass.ch |
Source: | vm\classes.c |
LIB: | xhb.lib |
DLL: | xhbdll.dll |
// The example outlines usage of a destructor method // being called when an object becomes subject to // garbage collection. The output of the example shows // the sequence of destruction as the objects become // inaccessible in the course of the program. #include "HbClass.ch" PROCEDURE Main LOCAL obj := Test():new( "First object" ) TestProc() RETURN // object stored in LOCAL variable PROCEDURE TestProc() LOCAL obj := Test():new( "Second object" ) LOCAL bBlock := TestFunc() RETURN // object stored in PUBLIC variable is released // object stored in detached LOCAL is returned FUNCTION TestFunc() LOCAL bBlock := TestBlock() object := NIL RETURN bBlock // objects stored in detached LOCAL variable and PUBLIC variable FUNCTION TestBlock() LOCAL obj := Test():new( "Third object" ) PUBLIC object := Test():new( "Fourth object" ) RETURN {|| obj:name } CLASS Test EXPORTED: DATA name METHOD init DESTRUCTOR destroy // declaration of destructor ENDCLASS METHOD init( cName ) CLASS Test ::name := cName RETURN self PROCEDURE destroy CLASS Test // implementation of destructor ? "Object:", ::name, "Destroyed in:", ProcName(1) RETURN // **************** Output ******************** // Object: Fourth object Destroyed in: TESTFUNC // Object: Third object Destroyed in: TESTPROC // Object: Second object Destroyed in: TESTPROC // Object: First object Destroyed in: MAIN
http://www.xHarbour.com