解除分配 Fortran 派生类型是否也会自动解除分配成员数组和指针?

Does deallocating a Fortran derived type automatically deallocate member arrays and pointers as well?

在 Fortran 中,如果我有一个派生类型的可分配数组,每个派生类型都由一个指针和一个可分配数组组成,

type group
  real, pointer :: object
  real, allocatable :: objectData(:,:)
end type group

type(group), allocatable :: myGroup(:)

我是否能够通过简单地进行一次调用来释放此类型中包含的所有内存

deallocate(myGroup)

或者我是否需要先解除分配每个类型中的数组,然后再解除分配派生类型:

do i = 1, size(myGroup)
  nullify(myGroup(i)%object)
  deallocate(myGroup(i)%objectData)
end do

deallocate(myGroup)

我倾向于选项 2 并在释放派生类型之前使所有内存无效,如果这不仅仅是为了确保不会发生内存泄漏,但如果选项 1 是等效的,那么这将有助于将来参考和帮我省几行代码。

只有可分配的组件会自动解除分配。您必须自己解除分配指针。

小心,您必须解除分配 指针,而不仅仅是nullify。使它无效只是删除对已分配内存的引用。如果不解除分配,就会发生内存泄漏。

您知道 但指针不是。但是对于

would I be able to deallocate all memory contained in this type by simply making a single call

答案是:是的(需要一些努力)。

如果类型 groupfinalizable 则该类型的实体在被释放时被终结。

type group
  real, pointer :: object
  real, allocatable :: objectData(:,:)
 contains
  final tidy_up
end type group

程序

subroutine tidy_up(myGroup_array)
  type(group), intent(inout) :: myGroup_array(:)
  ! ... deallocate the pointers in the elements of the array
end subroutine

您可以使用此终结处理指针组件。

最后,注意some subtleties。另请注意,这会在一定程度上减少您对指针是否被释放的控制(很多时候您不希望它被释放)。