【问题标题】:Does deallocating a Fortran derived type automatically deallocate member arrays and pointers as well?释放 Fortran 派生类型是否也会自动释放成员数组和指针?
【发布时间】:2015-05-16 06:38:55
【问题描述】:

在 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 是等效的,那么这将对将来的参考有用并拯救我几行代码。

【问题讨论】:

    标签: memory-leaks fortran


    【解决方案1】:

    你知道allocatable components are deallocated automatically 但指针不是。但是对于

    我是否可以通过简单的调用来释放此类型中包含的所有内存

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

    如果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。另请注意,这在一定程度上降低了您对指针是否被释放的控制(很多时候您不希望它被释放)。

    【讨论】:

    • 这个我老是忘记了,因为gfortran还有些落后,但是在全力支持之后会是件好事。
    • 这是另一个警告:需要编译器支持。
    【解决方案2】:

    只有可分配的组件会被自动释放。您必须自己释放指针。

    小心,你必须deallocate指针,而不仅仅是nullify。取消它只会删除对分配内存的引用。如果不解除分配,就会发生内存泄漏。

    【讨论】:

    • 糟糕,提醒您也可以解除分配指针。谢谢!这回答了我的问题。
    • 只有在指针之前已分配且不再使用分配的数据时,才需要解除分配指针。但是如果数据还在使用中,nullify 就可以了。所以指针的释放不是必需的,这取决于你在做什么。
    • @alexis 当然,这很明显。但这不是这个问题的主题。 OP 明确希望“能够释放此类型中包含的所有内存”
    • @Vladimir 我明白了,但是如果没有分配指针,我猜内存不是“包含在这种类型中”而是其他地方,对吧?消除任何疑问可能是件好事......
    猜你喜欢
    • 2015-07-28
    • 2021-07-27
    • 2017-07-27
    • 1970-01-01
    • 2017-05-07
    • 2020-10-01
    • 1970-01-01
    • 2017-01-29
    • 1970-01-01
    相关资源
    最近更新 更多