DELETE OBJECT statement
- Last Updated: October 8, 2024
- 3 minute read
- OpenEdge
- Version 12.2
- Documentation
Syntax
This is the syntax for deleting an instance of a class:
|
- object-reference
- A data element containing a reference to an instantiated object.
For
example, to delete the instance of the sample class, execute the DELETE OBJECT statement,
as shown:
|
DELETE OBJECT on an object reference but there is still another reference to
that object, the other reference will become invalid. Therefore, unless you are sure that
the object is no longer needed, it is best to allow garbage collection to delete class-based
objects. You just need to be sure that any reference no longer needed is set to the Unknown
value (?), or will naturally go out of scope. There is
one case where garbage collection will not occur and that is when there is a circular
reference (for example, object A has a reference to object B and object B has a reference
to object A). In this case, a link in the chain needs to be broken in order for garbage
collection to free the objects involved. To break the chain, set one of the references to
the Unknown value (?) or use DELETE OBJECT on the reference. But again, this is not appropriate if there
are other references that need to remain valid.
There are other ways to create a
circular reference, that do not only involves classes. One case is when a procedure (or
class) instantiates a class object that then binds to a temp-table or dataset (via the
BIND option) in the procedure. In this case, there is circular
dependency: the procedure holds a reference to the class instance, and the class instance
depends on the temp-table or dataset from the procedure (via the BIND
option). The application code needs to break that circular reference before being able to
delete the objects. Another situation that can cause circular references is a class that
subscribes to an event in another class, if the class that has the event also has a
reference to the class that subscribed to the event. In this case, make sure you
unsubscribe from the event when done with it.
For more information on deleting class-based objects, see Delete an object.
DELETE OBJECT THIS-OBJECT to
abort class instantiation, which sets the returned object reference
to the Unknown value (?). However, Progress Software Corporation recommends
that you use RETURN ERROR or UNDO, THROW to
return ERROR from the constructor. This both aborts
class instantiation and raises an ERROR condition
that you can handle in the instantiating context. For more information
on class instantiation, see Construct an object.
For more information on raising ERROR within a
constructor, see Raise errors within an instance constructor.During
garbage collection and when a DELETE OBJECT statement
executes, the AVM frees all allocated memory associated with the
object reference and invokes the destructor for each class in the
object’s class hierarchy, if one has been defined. An application can
use the destructor for a class to release any resources that it
has acquired during the execution of the object instance.
OpenEdge includes
a performance tuning feature for ABL class-based applications that
controls how the AVM deletes objects. The Re-usable Objects Cache
(-reusableObjects) startup parameter specifies
the number of deleted class objects that the AVM stores for later
re-initialization. By default, -reusableObjects is
set to 25. When you use -reusableObjects, the AVM
transfers the deleted object for most ABL classes to a re-usable
objects cache. If your application causes the AVM to instantiate
the same class later, the stored object is re-initialized and removed
from the cache. The re-initialized object has a new UUID and the
same initial data as a new instance of the class. The re-use of
the object saves much of the overhead of instantiating a class.
For more information on the re-usable objects
cache, see the DELETE OBJECT statement
in ABL Reference and the Re-usable
Objects Cache (-reusableObjects) startup parameter
in Startup Command and Parameter Reference.
When
the client session is shut down, the AVM deletes all remaining class instances,
invokes the destructor for each class in the object’s class hierarchy (unless
you specified -nogc), empties the re-usable object cache,
and frees all resources associated with the classes.