Если у меня есть выделяемый массив финализируемого производного типа, будет ли финализатор вызываться для каждого отдельного элемента, когда массив выходит за пределы области видимости?
Вот небольшой пример кода, который иллюстрирует вопрос:
module LeakyTypeModule
implicit none
private
type, public :: LeakyType
real, pointer :: dontLeakMe(:) => null()
contains
procedure :: New
final :: Finalizer
end type
contains
subroutine New(self, n)
class(LeakyType), intent(out) :: self
integer , intent(in) :: n
allocate(self%dontLeakMe(n))
self%dontLeakMe = 42.0
end subroutine
subroutine Finalizer(self)
type(LeakyType), intent(inout) :: self
if (associated(self%dontLeakMe)) deallocate(self%dontLeakMe)
end subroutine
end module
program leak
use LeakyTypeModule
implicit none
type(LeakyType), allocatable :: arr(:)
allocate(arr(1))
call arr(1)%New(1000)
deallocate(arr)
end program
Обратите внимание, что эта программа пропускает массив dontLeakMe
, выделенный в New()
методе LeakyType
. Сначала это было немного удивительно для меня, но потом я обнаружил, что проблему можно решить, объявив финализатор elemental
. И gfortran, и ifort ведут себя одинаково, поэтому я предполагаю, что это поведение соответствует стандарту Fortran 2003.
Кто-нибудь может это подтвердить? Честно говоря, мне трудно понять, что стандарт говорит по этому поводу.
Прямо сейчас я также не вижу особого смысла в том, чтобы не объявлять все мои финализаторы элементарными. Есть ли здесь какое-нибудь приложение, которое я не замечаю?