HP 3000 Manuals

Dispose Procedure [ HP Pascal/iX Programmer's Guide ] MPE/iX 5.0 Documentation


HP Pascal/iX Programmer's Guide

Dispose Procedure 

The predefined procedure dispose takes a pointer variable as a parameter
and deallocates the dynamic variable that it references.  When the
variable is deallocated, it is inaccessible, and the pointer is
undefined.  Files in the deallocated space are closed.

The procedure new can only reallocate the space that dispose has
deallocated if the program contains the compiler option HEAP_DISPOSE. For
more information, refer to the
HP Pascal/iX Reference Manual or the HP Pascal/HP-UX Reference Manual,
depending on your implementation.

It is an error to call dispose with a pointer that is:

   *   Undefined.

   *   Nil.

   *   The dynamic variable referenced by a pointer that is the actual
       parameter, passed by reference, of a currently executing routine.

   *   The dynamic variable referenced by a pointer that is in the record
       variable list of a currently executing WITH statement.

Example 1 

     PROGRAM prog;
     TYPE
        rec = RECORD
                 f1,f2,f3 : integer;
              END;

        recptr = ^rec;
     VAR
        v1,v2,v3,v4,v5 : recptr;

     PROCEDURE p (VAR x : rec);
     BEGIN
        dispose(v4);  {illegal -- disposes x's actual parameter}

     END;

     PROCEDURE q;
     BEGIN
        dispose(v4);  {illegal -- v4^ is in the record variable
                       list of an active WITH statement}
     END;

     (Example is continued on next page.)

     PROCEDURE r (VAR z : recptr);
        PROCEDURE s;
        BEGIN
           dispose(v4);  {illegal -- v4^ is the actual parameter for z}
        END;
     BEGIN
        s;
     END;
     BEGIN
        new(v1);
        WITH v1^ DO BEGIN
           f1 := 0;
           f2 := 0;
           f3 := 0;
        END;
        dispose(v1);
        dispose(v1);  {illegal -- v1 is undefined}

        new(v2);
        dispose(v2);

        new(v3);
        v3 := nil;
        dispose(v3);  {illegal -- v3 is nil}

        new(v4);
        p(v4^);

        new(v4);
        r(v4);    {s (within r) disposes r's actual parameter v4,
                  which is illegal}
        new(v4);
        new(v5);
        WITH v4^,v5^ DO BEGIN
           f1 := 1;
           f2 := 2;
           f3 := 3;
           q;  {illegal -- q disposes v4 while the WITH statement
                           whose record variable list it is in
                           is active}

           dispose(v5);  {illegal -- v5 is in the record variable list
                                     of an active WITH statement}
        END;
     END.

If you specify tags when you allocate a variable with new, you must
specify the same tags in the same order when you deallocate the variable
with dispose.

Example 2 

     PROGRAM prog;

     TYPE
        rec = RECORD
                 CASE t1 : (a,b) OF
                    a : (a1,a2 : integer);
                    b : (b1 : RECORD
                                 CASE t2 : (c,d) OF
                                    c : (c1 : char);
                                    d : (d1,d2 : real);
                              END
                        );
              END;

        recptr = ^rec;

     VAR
        v1,v2,v3,v4,v5 : recptr;

     BEGIN
        new(v1);
        new(v2,a);
        new(v3,b);
        new(v4,b,c);
        new(v5,b,d);

        dispose(v1);
        dispose(v2,a);
        dispose(v3,b);
        dispose(v4,b,c);
        dispose(v5,b,d);

        new(v1);
        new(v2,a);
        new(v3,b);
        new(v4,b,c);
        new(v5,b,d);

        dispose(v1,a);    {illegal -- a not specified on new}
        dispose(v2,b);    {illegal -- b not specified on new}
        dispose(v3);      {illegal -- b specified on new, but not here}
        dispose(v4,b);    {illegal -- c specified on new, but not here}
        dispose(v5,d,b);  {illegal -- b and d are in the wrong order}
     END.



MPE/iX 5.0 Documentation