【发布时间】:2013-07-01 10:34:21
【问题描述】:
我的 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
【问题讨论】:
-
注意
sizeof(供应商扩展)和size(fortran内在)是不同的东西。听起来你的程序中有一些错误的部分破坏了内存。是时候使用常规调试技术了(使用完整的调试选项进行编译,使用静态和动态代码正确性工具,开始对分以隔离代码的问题部分)。 -
您是说,您在没有任何干预代码的情况下进行分配、sizeof、然后解除分配?那么deallocate的失败就很奇怪了。如果有中间代码,那么显然要查看该代码。按照 IanH 的建议,打开所有调试选项,尤其是。运行时下标(边界)检查。确保将您的过程放在模块中,以便检查参数的一致性。
标签: fortran fortran90 memory-management