Greg Lindahl wrote:
> I'm
> asserting that since V in the function DEALLOC is a REAL, the
> information that it is actually allocated is lost. Am I correct?
I would say that you are wrong, however, this is a somewhat murky area,
especially with array pointers, see appended at the end a recent
Interpretation request I submitted to J3 (the final vote on it has not
come in yet). One can deallocate a pointer if it is "associated with
the whole of an object that was created by allocation." So I would say
in your example VP is associated with the whole of an object created by
allocation (it is only the target that matters here, and it is exactly
the same target for both pointers in your example).
This effectively prohibits an implementation from associating allocation
information with the pointers themselves, and instead forces one to
keep that stuff in the allocator tables instead. At least that's what I
think it does in practice.
Best,
Aleksandar
> INTEGER FUNCTION DEALLOC(V)
> INTEGER :: STATUS
> REAL, TARGET :: V
> REAL, POINTER :: VP
> VP => V
> DEALLOCATE (VP, STAT = STATUS)
> DEALLOC = STATUS
> END FUNCTION DEALLOC
Date: September 2004
To: J3
From: Aleksandar Donev
Subject: DEALLOCATE and array pointers
NUMBER:
TITLE: DEALLOCATE and array pointers
KEYWORDS: DEALLOCATE, array pointers
DEFECT TYPE:
STATUS: J3 consideration in progress
QUESTION:
We currently say that one can deallocate an array pointer if it points
to the "whole of an object that was created by allocation". What
exactly does "whole" mean in this rule?
Specifically, is the following allowed:
REAL, DIMENSION(:), POINTER :: a, b
ALLOCATE(a(1:10))
b=>a(1:10)
DEALLOCATE(b)
ANSWER:
Choice 1. Yes, this is allowed, since "whole" means that b is ASSOCIATED
with all elements of an array that was ALLOCATEd. In the given example,
ASSOCIATED(a,b) is .TRUE., therefore either a or b can be used to
DEALLOCATE the memory.
Choice 2. No, this was not meant to be allowed. "Whole" is meant to
convey that b must be pointer associated with a whole array, rather
than an array section. Since a(1:10) is a section and not a whole array
b cannot be used to deallocate the memory.
Note that some existing compilers implement choice 2, that is, they give
a runtime error when executing the DEALLOCATE statement above.
EDITS:
SUBMITTED BY: Aleksandar Donev
HISTORY: 04-??? m170 Submitted
|