如果我有一个可终结派生类型的可分配数组,当数组超出范围时,是否会在每个单独的元素上调用终结器?
这是一个说明问题的小代码示例:
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
分配的数组。起初这对我来说有点令人惊讶,但是后来我发现可以通过声明 finalizer 来解决这个问题。gfortran 和 ifort 的行为方式相同,因此我假设这种行为遵循 Fortran 2003 标准。New()
LeakyType
elemental
谁能证实这一点?老实说,我很难理解标准在这个特定点上所说的内容。
现在我也看不出不声明我所有的终结器元素有多大用处。这有我忽略的任何应用程序吗?