【问题标题】:When is array deallocating necessary?什么时候需要解除数组分配?
【发布时间】:2018-11-11 01:46:16
【问题描述】:

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

提前致谢

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

【问题讨论】:

    标签: fortran


    【解决方案1】:

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

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

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

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

    此外,当分配的对象与具有属性INTENT(OUT) 的虚拟参数关联时,在进入过程之前会发生解除分配。

    ** 指针变量警告:**

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      但是,如果一个程序需要对可分配变量进行终结以确保正确性,那么就需要为其设置一个deallocate 语句:当停止或结束程序语句导致执行终止时,不会发生终结。


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

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

      【讨论】:

        猜你喜欢
        • 2022-11-28
        • 1970-01-01
        • 2011-11-20
        • 1970-01-01
        • 1970-01-01
        • 2012-09-16
        • 2012-08-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多