fortran 有垃圾收集器(gc)吗?
Posted
技术标签:
【中文标题】fortran 有垃圾收集器(gc)吗?【英文标题】:Does fortran have a garbage collector(gc)? 【发布时间】:2012-12-07 15:57:58 【问题描述】:我最近和一个说他做过 Fortran 编程的人交谈过(从很久以前开始),但他不能告诉我 Fortran 是否有垃圾收集器。他告诉我他没有在 Fortran 中使用 malloc 或 free,所以我的假设是它确实有一个垃圾收集器?还是fortran没有垃圾收集器,只是泄漏内存,程序结束时会被操作系统回收?我对 Fortran 一无所知,只是它以前被使用过。我也尝试了快速的谷歌搜索,但找不到任何东西。
【问题讨论】:
Fortran 至今仍在使用。 他告诉我它还在银行等处使用?用例? 科学编程,很多时候。 Fortran 有多维数组。 ***.com/questions/8997039/… 使用 malloc 和 free 与垃圾收集器完全无关。 【参考方案1】:不,Fortran 没有垃圾收集器。然而,在这个程度上有一个add-on package for F90。不,我没用过。
【讨论】:
现代 Fortran 中可能存在内存泄漏,因此可以使用垃圾收集器来回收内存。据我所知,NAG Fortran 编译器是唯一在运行时提供垃圾收集器的编译器。 nag.com/nagware/np/r70_doc/f90_gc.html【参考方案2】:现代 Fortran 有多种声明变量的方法。简单声明的项目将在实体范围内存在。所以在一个过程中声明的“real, dimension (N) :: array”将在该过程返回时自动消失。自然地,在主程序或模块变量中声明的变量或 common(过时)将在程序运行期间持续存在。
可以使用“allocate”动态分配变量(为此,必须使用 allocatable 属性声明它们)。由于 Fortran 95 过程本地的可分配变量会在过程返回时自动释放!他们不会泄漏内存! (一些程序员可能认为显式释放变量是一种很好的做法,即使它不是绝对必要的。)(当然,如果不显式释放一个你知道你不知道的变量,你可能会浪费内存不再需要了。)
使用指针可能会泄漏内存。您可以使用指针分配内存,然后将指针分配给另一个变量,从而丢失先前的关联。如果您没有释放该内存,那么您就有泄漏。与其他语言相比,Fortran 对指针的需求更少……很多事情都可以使用可分配变量来完成,这样更安全——没有内存泄漏。
相关问题:Fortran allocatable array lifetime和ALLOCATABLE arrays or POINTER arrays?
【讨论】:
我将补充一点,对于可分配派生类型的组件也是如此。它们会随着父级的释放(手动或自动)自动释放。 第二段第一句的措辞不包括括号部分的指针。作为“can”的扩展,在现代 Fortran (2003+) 中也可以在不使用 allocate 语句的情况下动态分配可分配对象。第三段,第二句具有向后分配的含义。关于指针,我认为标准技术上 allows 进行垃圾收集(但明确不 require 它) - 你“可能”有泄漏。我认为最近的标准中实际上有关于此的注释或类似内容,但我找不到 - 也许我的记忆有误。以上是关于fortran 有垃圾收集器(gc)吗?的主要内容,如果未能解决你的问题,请参考以下文章