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

Qua*_*odo 5 fortran

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

提前致谢

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

Rod*_*ues 7

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

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

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

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

此外,当实际参数与具有该属性的伪参数相关联时INTENT(OUT),在进入该过程之前会发生释放.

**指针变量警告:**

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

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


fra*_*lus 7

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

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

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

但是,如果程序需要对可分配变量进行终结以确保正确性,那么就必须有一个deallocate声明:当执行因停止或结束程序语句而终止时,不会发生终结。


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

然而,作为历史记录,这在 Fortran 90 中并非如此。在 Fortran 90 中,此类变量没有被释放,更糟糕的是它们的分配状态变得未定义(因此甚至无法查询分配状态)。一个人真的很想在deallocate那里。这个缺陷在 Fortran 95 中得到了纠正,但习惯和代码可能会存在很长时间。