Fortran 2008 представляет концепцию IMPURE ELEMENTAL, которая очень удобна для написания финализаторов.
у меня есть размещаемый массив финализуемого производного типа, будет ли финализатор вызываться для каждого отдельного элемента, когда массив выходит из области видимости?
Вот небольшой пример кода, который иллюстрирует вопрос:
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.
Кто-нибудь может это подтвердить? Честно говоря, мне трудно понять, что говорит стандарт по этому конкретному вопросу.
Прямо сейчас я также не вижу большой пользы вне объявляя все мои финализаторы элементальными. Есть ли какое-либо приложение, которое я пропускаю?