什么时候阵列需要解除分配?

时间:2018-06-01 00:34:13

标签: fortran

我已经读过将DEALLOCATE应用于已分配的数组会释放它正在使用的空间。我在程序中处理了几个可分配的数组,但从来没有打扰过它们。有没有一种方法可以确定解除分配是否/如何影响执行时间?

提前致谢

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

2 个答案:

答案 0 :(得分:7)

实际上,解除分配会释放变量占用的内存,但并不总是需要手动执行。

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

但是,当变量超出范围(Fortran 95或更高版本,如@francescalus指出)或当您到达程序结束时,将自动释放。

此外,如果需要,在分配之前,如果数组的维度不一致或者变量是多态的并且必须采用一致的动态类型,则会自动释放。 (此行为是Fortran2003或更高版本,可能需要在某些编译器上打开)。

此外,当实际参数与具有属性INTENT(OUT)的伪参数相关联时,在进入过程之前会发生重新分配。

** 指针变量警告:**

如果您为pointer变量明确分配了存储(使用allocate语句),之后执行指针关联(=>),则不会自动释放。您负责在执行此操作之前释放变量,否则将发生内存泄漏。

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

答案 1 :(得分:3)

解除分配不再需要的变量会影响执行速度吗?是。是否可能在"正常"程式?不,如果不能防止内存泄漏。

我没有任何有价值的启发式方法可以帮助您确定解除分配的有效性,以及#34;。

如前所述,为了正确性或避免内存泄漏,可能需要解除分配。

但是,如果一个程序需要完成一个可分配变量的正确性,那么就需要有一个deallocate语句:当一个停止或结束程序语句终止执行时不会发生终结

在过程结束执行时,会自动释放在没有save属性的过程(子例程或函数)中声明的可分配变量(所谓的未保存的局部变量)。

但是,作为一个历史记录,这在Fortran 90中并非如此。在Fortran 90中,这些变量没有被释放,更糟糕的是它们的分配状态变得不确定(因此,即使分配状态也不能解决) ;被查询)。一个人真的想在那里deallocate。 Fortran 95修正了这个缺陷,但习惯和代码可能会存在很长时间。