Fortran 可分配数组生命周期

Posted

技术标签:

【中文标题】Fortran 可分配数组生命周期【英文标题】:Fortran allocatable array lifetime 【发布时间】:2012-08-03 23:24:09 【问题描述】:

假设我有以下代码:

program test
  call foo
  call foo
contains
  subroutine foo
    integer(8),dimension(:),allocatable:: var1
    allocate(var1(10))
    ...
    return
  end subroutine foo
end

变量 var1 会被分配两次吗? (我猜是)。如果每次调用都分配,那么第一次调用时分配的内存是否会空闲?

【问题讨论】:

【参考方案1】:

每次执行 ALLOCATE 语句时(即每次调用 foo 过程)都会(尝试)分配 var1。

根据 Fortran 90 的规则(仅),当过程结束时,foo 的分配状态变为未定义。具有未定义分配状态的变量将变得不可用 - 您不能在随后的过程调用中合法地重新分配。

在 Fortran 95 及更高版本中,因为它是一个本地的、未保存的变量,所以每次 foo 过程执行结束时都会释放 var1。

【讨论】:

在 Fortran 95 中添加了在退出过程时自动释放本地、未保存的可分配对象以避免内存泄漏。 fortran95?我正在使用fortran90。那么行为会改变吗? 在 Fortran 90 中不保证。什么编译器是 Fortran 90 但不兼容 Fortran 95? 如果在 double (Fortran 90) 中,您可以在过程末尾添加显式 deallocate 语句。 是的 - 我错过了 Fortran 90 标准的标签。

以上是关于Fortran 可分配数组生命周期的主要内容,如果未能解决你的问题,请参考以下文章

java线程生命周期(thread)

java_5:线程的生命周期和状态转换

并发基础之线程的生命周期

通过 Cloudformation 将配方分配给 Opsworks 中的生命周期事件

[转]Android静态变量的生命周期

c++中堆栈分配数据的生命周期