(j3.2006) (SC22WG5.3968) question about deallocation

Malcolm Cohen malcolm
Sun Mar 29 20:30:40 EDT 2009



Robert Corbett wrote:
> Consider the code fragment
>
>        MODULE M
>          . . .
>          TYPE BASE
>            INTEGER I
>          CONTAINS
>            FINAL SUBR1
>          END TYPE
>          TYPE, EXTENDS(BASE) :: EXTENDED
>          CONTAINS
>            FINAL SUBR2
>          END TYPE
>          . . .
>        END MODULE
>
>        PROGRAM MAIN
>          USE M
>          TYPE(EXTENDED), POINTER :: P
>          TYPE(BASE), POINTER :: Q
>          . . .
>          ALLOCATE(P)
>          Q => P%BASE
>          . . .
>          DEALLOCATE(Q)
>          . . .
>        END
>
> Is the DEALLOCATE statement standard conforming?
No.

Q is not associated with the whole of the object allocated by P, but 
only the "base" component thereof.

The answers that indicate otherwise are mistaken.  Whether EXTENDED 
takes up more memory than BASE in some/most/all implementations is not 
relevant to the question.  BASE is a part of EXTENDED, not the whole.  
It is certainly not prohibited for some implementation to actually have 
EXTENDED objects taking up more space than BASE (whether it is sensible 
is another matter).

>       ALLOCATE(P(1))
>       Q => P(1)
>       DEALLOCATE(Q) 

Did we *really* say that in an official interpretation?  Which one?  
Assuming we did, I share your disquiet about the overly simplistic reply 
to this other question, but they can be separated - if one accepts that 
arrays are just collections of elements.  It's not clear to me that 
that's a good thing to do (rather the opposite in fact), but it is not 
quite the same question.

Bill Long wrote (that it should be allowed and):
> The type of the object being deallocated is BASE, and a final routine is
> bound to the type, so I would say SUBR1 (only) is executed.
>   
That answer is not consistent with the design of final subroutines, and 
not consistent with types.  An object of type EXTENDED was allocated.  
To deallocate an object of type EXTENDED one must deallocate an object 
of type EXTENDED - this must be fundamental to the whole idea of derived 
types.  As far as I am concerned there is no question - the program is 
not, and cannot reasonably be considered to be, standard conforming.

Cheers,
-- 
.......................Malcolm Cohen, Nihon NAG, Tokyo.





More information about the J3 mailing list