解除分配模块中声明的变量时出错

时间:2013-07-03 16:12:47

标签: fortran fortran90 memory-management

我的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

1 个答案:

答案 0 :(得分: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的相同子例程或模块上)并且它总是被证明是一种保持数组不变的好方法控制。

我真的希望这会有所帮助......这是我的第一个答案:) 编辑:我在示例代码

上纠正了一点错误