如果一个数组在循环中被重新分配并且从未在Fortran中释放,会发生什么?

时间:2013-02-23 01:22:20

标签: fortran

我想知道以下代码对内存的作用:

program A

While (t < large number)
 allocate(a)
 ...

end program

“allocate(a)”是指在每次迭代时引用相同的内存位置,如果在程序结束之前没有使用deallocate(a),是否存在内存泄漏?

2 个答案:

答案 0 :(得分:5)

答案是分配已经分配的项是错误的,所以这个代码示例是错误的。

如果项目声明为allocatable,我尝试的编译器会在运行时注意到错误。他们没有注意到该项是否使用pointer属性声明。在这种情况下,你有一个内存泄漏,因为在早期的迭代中已经保留了内存,但是由于指针已被重用,因此无法再到达它。

答案 1 :(得分:1)

要回答您的其他问题,使用allocatable对象泄漏内存是不可能的。例如,具有本地范围的可分配数组在到达returnend时取消分配(除非它们被保存),可分配类型组件将与其父级一起自动释放。

在程序结束之前不释放对象并不是在无法寻址的内存意义上的泄漏,因为您的程序在执行期间仍然可以访问它。 Valgrind将此内存报告为“仍可访问”。您可能会认为取消分配此类对象的风格更好,但您不需要。