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.

Кто-нибудь может это подтвердить? Честно говоря, мне трудно понять, что говорит стандарт по этому конкретному вопросу.

Прямо сейчас я также не вижу большой пользы вне объявляя все мои финализаторы элементальными. Есть ли какое-либо приложение, которое я пропускаю?

Ответы на вопрос(1)

Ваш ответ на вопрос