Destructor (Module)

Specifies execution of a procedure at program termination

Syntax
   [Public | Private] Sub identifier [Alias "external_identifier"] [()] 
   Destructor [priority] [Static]
      { procedure body }
   End Sub

Description
   Defines a procedure to be automatically called from a compiled program's 
   end-code.  End-code is generated by the compiler and is executed when 
   the program terminates normally.  Procedures defined as destructors may 
   be used the same way as ordinary procedures, that is, they may be called 
   from within module-level code, as well as other procedures.  

   The procedure must have an empty parameter list.  A compile-time error 
   will be generated if the Destructor keyword is used in a Sub definition 
   having one or more parameters. In a set of overloaded procedures, only 
   one (1) destructor may be defined because of the ambiguity of having 
   multiple Subs which take no arguments.

   In a single module, depending on the build and run-time environment of 
   the target system:
      * destructors may execute in which they are defined, or reverse 
        order
      * destructors may execute before or after global static variables 
        having dstructors
      * destructors may execute before or after other module destructors 
        having priority attribute
      * destructors with priority attribute may execute before or after 
        global static variables having destructors

   The priority attribute, an integer between 101 and 65535, can be used to 
   force destructors to be executed in a certain order.  The value of 
   priority has no specific meaning, only the relationship of the number 
   with other destructor priorities. 101 is the lowest priority and is 
   executed last, relative to other destructors also having priority 
   attribute.

   A module may define multiple destructor procedures.  Destructor 
   procedures may also appear in more than one module. All procedures 
   defined with the syntax shown above will be added to the list of 
   procedures to be called during the program's termination.

   The order in which destructors defined in multiple modules are executed 
   is known only at link time.  Therefore, special care should be taken 
   when using destructors that may call on a secondary module also defining 
   a destructors.  In such a case it is advisable to use a single 
   destructor that explicit calls termination procedures in multiple 
   modules to ensure a graceful termination of the application.

   Destructors will be called if the program terminates normally or if 
   error-checking is enabled and the program terminates abnormally.

   Public static member procedures (a Sub having an empty parameter list), 
   of user defined Type can be defined as a module destructor, by adding 
   the Constructor keyword used in the sub procedure definition.

   The module destructor feature exposes a low-level link-time feature of 
   the build and run-time environment.  Accessing global static objects 
   having destructors from module destructors should be avoided due to 
   variations in execution order on different build systems.

   Warning for 64-bit compiler only: See the Identifier Rules page for the 
   choice of user procedure identifier names (and specially the 'Platform 
   Differences' paragraph).

Example
   Sub pauseonexit Destructor
      
      '' If the program reaches the end, or aborts with an error, 
      '' it will run this destructor before closing
      
      Print "Press any key to end the program..."
      Sleep
      
   End Sub

   Dim array(0 To 10, 0 To 10) As Integer
   Dim As Integer i = 0, j = 11

   '' this next line will cause the program to abort with an 
   '' error if you compile with array bounds checking enabled (fbc -exx ...)
   Print array(i, j)

Differences from QB
   * New to FreeBASIC

See also
   * Destructor (Class)
   * Constructor (Module)
   * Sub

