解除分配 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
答案是:是的(需要一些努力)。
如果类型 group
是 finalizable 则该类型的实体在被释放时被终结。
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。另请注意,这会在一定程度上减少您对指针是否被释放的控制(很多时候您不希望它被释放)。
在 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
答案是:是的(需要一些努力)。
如果类型 group
是 finalizable 则该类型的实体在被释放时被终结。
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。另请注意,这会在一定程度上减少您对指针是否被释放的控制(很多时候您不希望它被释放)。