Navigation: Language Reference > 3 - Variable Declarations > Data Declarations and Memory Allocation >====== DISPOSE (de-allocate heap memory) ====== | |
DISPOSE( reference )
DISPOSE | De-allocates heap memory previously allocated by a NEW statement. |
reference | The label of a reference variable previously used in a reference assignment with the NEW statement. This reference may be NULL and no ill effects will occur. |
The DISPOSE statement de-allocates the heap memory previously allocated by a NEW statement. If DISPOSE is not called, the memory is not returned to the operating system for re-use (creating a “memory leak”). However, if you DISPOSE of a reference that is still in use (such as a QUEUE being displayed in a LIST control) you will quite likely cause a GPF that will be very difficult to track down.
DISPOSE(SELF) is a legal statement to de-allocate the current object instance. However, if used, it must be the last statement in the procedure, or any following references to the object will cause problems.
There is a way to pass a &STRING reference to a procedure in a way that it can be disposed in that procedure. Although a *STRING cannot be disposed, consider the following code:
MyProc PROCEDURE (*STRING S)
Ref &STRING,AUTO
CODE
Ref &= S
DISPOSE (Ref)
The Parameter/result of *STRING type can be considered as a read only &STRING value: you can change the string it points to but you can't set it to reference to another string. DISPOSE sets the reference passed to it as a parameter to NULL and hence *STRING parameters and
results can't be DISPOSEd directly but assigning their reference to a reference variable gives a solution. This is also true for any other data type.
If for any reason you plan to use DISPOSE on an object in a queue that was created with NEW, to prevent a possible memeory leak you must issue the DISPOSE prior to any CLEAR (or DELETE) is executed.
In WIN 32 Clarion (e.g., Clarion 6/7) DISPOSE is used to explicitly de-allocate memory allocated by NEW statement. In Clarion .NET DISPOSE doesn't free memory, but the destructor (DESTRUCT/Dispose method) of the corresponding class that is executed.
Example:
StringRef &STRING !A reference to any STRING variable
Animal CLASS,TYPE
Feed PROCEDURE(short amount),VIRTUAL
Weight LONG
END
AnimalRef &Animal !A reference to any Animal CLASS
NameQ QUEUE
Name STRING(30)
END
QueRef &NameQ !A reference to any QUEUE with only a STRING(30)
CODE
AnimalRef &= NEW(Animal) !Create new instance of an Animal class
DISPOSE(AnimalRef) !De-allocate the Animal
QueRef &= NEW(NameQ) !Create new instance of a NameQ QUEUE
DISPOSE(QueRef) !De-allocate the queue
StringRef &= NEW(STRING(50()) !Create new STRING(50) variable
DISPOSE(StringRef) !De-allocate the STRING(50)
See Also:
NEW