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