什么时候需要数组释放?

问题描述 投票:0回答:2

我读到,将

DEALLOCATE
应用于已分配的数组可以释放它正在使用的空间。我在程序中处理几个可分配的数组,但从不费心取消分配它们。有没有一种方法可以确定解除分配是否/如何影响执行时间?

提前致谢

PS:我不太愿意直接进行此测试(通过比较有和没有释放的执行时间),因为程序依赖于随机变量,其值最终会影响性能。

fortran
2个回答
12
投票

确实,释放会释放变量占用的内存,但并不总是需要手动执行。

如果您知道不再需要变量的内容并且需要释放内存以供其他要分配的变量(或系统),则可以使用

deallocate
语句。

但是,当变量超出范围(Fortran 95 或更高版本,如 @francescalus 指出)或到达程序末尾时,会自动发生释放。

此外,在两种情况下,释放会在分配之前自动发生(必要时):

  • 如果数组左右两侧的尺寸不一致
  • 或者如果变量是多态的并且必须采用一致的动态类型。 (此行为是 Fortran2003 或更高版本,可能需要在某些编译器上打开)。

此外,当分配的对象与具有属性

INTENT(OUT)
的虚拟参数参数关联时,释放会在进入过程之前发生。

** 指针变量警告:**

如果您显式为

pointer
变量分配存储空间(使用
allocate
语句),然后执行指针关联 (
=>
),则释放不会自动发生。您有责任在执行此操作之前释放变量,否则会发生内存泄漏。

最后一点,尝试释放未分配的变量会引发错误。您可以检查可分配变量是否已使用内部函数分配

allocated


8
投票

释放不再需要的变量会影响执行速度吗?是的。在“正常”程序中可能吗?不,如果不能防止内存泄漏。

据我所知,没有任何有价值的启发式方法可以帮助您确定“为了速度”释放分配的有用性。

如前所述,为了正确性或避免内存泄漏,释放可能是必要的。

但是,如果程序需要对可分配变量进行终结以确保正确性,则需要有一个

deallocate
语句:当通过 stop 或 end 程序语句终止执行时,不会发生终结。


在过程(子例程或函数)中声明的没有

save
属性的可分配变量(所谓的未保存的局部变量)将在过程结束执行时自动释放。

但是,从历史记录来看,这在 Fortran 90 中并非如此。在 Fortran 90 中,此类变量不会被释放,更糟糕的是它们的分配状态变得未定义(因此甚至无法查询分配状态)。有人真的想要一个

deallocate
。这个缺陷在 Fortran 95 中得到了纠正,但习惯和代码可能会持续很长时间。

© www.soinside.com 2019 - 2024. All rights reserved.