1

我的 Fortran 90 代码存在问题,涉及解除分配在模块中声明的数组,然后在子例程中分配和初始化。在我的程序中,我在模块中声明了一堆数组,例如real*8, dimension(:), allocatable :: test. 然后,在初始化子例程中,use模块,用 分配变量 allocate(test(8)),并用 初始化它test = 0.d0

在此之后,我可以print*, test得到适当的输出: 0.E+0 0.E+0 0.E+0 0.E+0 0.E+0 0.E+0 0.E+0 0.E+0. 此外,调用allocated(test)返回.TRUE.。尽管如此,还是出了点问题。直接在调用之后,allocate()调用sizeof(test)返回0和调用deallocate(test)抛出以下错误:

lib-4422 : UNRECOVERABLE library error 
  A DEALLOCATE statement argument points to a portion of the
 original allocation.
  Original size in bytes for the argument is 512
  Current size in bytes for the argument is 0
Segmentation fault

这一切都发生在一个更大的代码中,在整个代码中我都使用了这些数组而没有错误。我只是在寻找内存泄漏时试图在程序结束时释放内存时才注意到这个问题。我试图制作一个只执行上面描述的简单程序(即,在模块中声明,在子程序中分配和初始化,然后打印数组并在同一个子程序中释放它)。然而,这个简单的代码可以正常工作并且没有错误地运行。因此,我对在较大代码的上下文中可能导致其行为不端的原因感到非常困惑。此外,如果在我较大的代码中,我将声明行从模块移动到子例程,一切都会正常运行。

任何意见,将不胜感激!提前致谢,

~BCL

4

1 回答 1

0

在处理不是单个子例程内部的数组时,我总是 pointer 在声明它们时使用属性而不是属性。在实践中,两者的工作方式相同。例如:

module Mod1
contains
  subroutine sub1(Array)
    !*** Declaration of Variables
    implicit none
    !*** External Variables - Arguments
    real(kind=8), pointer, intent(inout) :: Array(:)
    !*** Internal Variables
    real(kind=8), allocatable            :: InternalArr(:)
    !*** Memory allocation
    allocate(Array(1:8))
    allocate(InternalArr(9:10))
    !*** End of Subroutine
  end subroutine sub1
end module Mod1

一旦您调用sub1,您的数组将在代码的任何位置保留其尺寸。您可以根据需要尽可能多地使用它deallocateallocate

在使用之前,pointer我遇到了一些问题,例如您描述的问题,有人建议我pointer改用。从那时起,我已经非常习惯以这种方式声明数组(如果它们打算保留在我一直使用的同一个子例程或模块上allocatable),并且它一直被证明是控制数组的好方法。

我真的希望这会有所帮助......这是我的第一个答案:) 编辑:我更正了示例代码中的一个小错误

于 2013-07-05T14:58:14.193 回答