Destructor

Called automatically when a class or user defined type goes out of scope or 
is destroyed

Syntax
   Type typename
      field declarations
      Declare Destructor ( )
   End Type

   Destructor typename ( ) [ Export ]
      statements
   End Destructor

Parameters
   typename 
      name of the Type of Class

Description
   The destructor method is called when a user defined Type or Class 
   variable goes out of scope or is destroyed explicitly with the 
   Delete Statement operator.

   typename is the name of the type for which the Destructor method is 
   declared and defined.  Name resolution for typename follows the same 
   rules as procedures when used in a Namespace.

   The Destructor method is passed a hidden This parameter having the same 
   type as typename.

   The destructor in a type is called before the destructors on any of its 
   fields.  Therefore, all fields are accessible with the hidden This 
   parameter in the destructor body.

   Only one destructor may be declared and defined per type (but several 
   destructors can be called in a chained way if the type contains or 
   inherits other types with their own destructors).

   Since the End statement does not close any scope, object destructors 
   will not automatically be called if the End statement is used to 
   terminate the program.

   Destructor can be also called directly from the typename instance like 
   the other member methods (Sub) and with the same syntax, i.e. using a 
   member access operator, e.g. obj.Destructor(). The object, and all its 
   members, are assumed to be constructed and in a valid state, otherwise 
   its effects are undefined and may cause crashes.  This syntax is useful 
   in cases where obj has been constructed manually, e.g. with obj.
   Constructor() or Placement New.

Example
   Type T
     value As ZString * 32
     Declare Constructor ( init_value As String )
     Declare Destructor ()
   End Type

   Constructor T ( init_value As String )
     value = init_value
     Print "Creating: "; value
   End Constructor

   Destructor T ()
     Print "Destroying: "; value
   End Destructor

   Sub MySub
     Dim x As T = ("A.x")
   End Sub

   Dim x As T = ("main.x")

   Scope
     Dim x As T = ("main.scope.x")
   End Scope

   MySub

Output:

   Creating: main.x
   Creating: main.scope.x
   Destroying: main.scope.x
   Creating: A.x
   Destroying: A.x
   Destroying: main.x

Dialect Differences
   * Object-related features are supported only in the -lang fb dialect.

Differences from QB
   * New to FreeBASIC

See also
   * Class
   * Constructor
   * Delete Statement
   * Destructor (Module)
   * Type

