FORTRAN中的内存泄漏问题,在子例程中分配数组并将其传回

时间:2013-11-29 18:50:52

标签: pointers memory-management fortran

我正在使用指针将一些数组传递给子程序,然后在该子程序中分配该数组并将其发送回第一个子程序。在一个模块中,我有类似的东西:

module call_test
   subroutine bla
      use test
      double precision, dimension(:), pointer :: xyz
   !
      interface boink
        subroutine boink(a) 
        implicit none 
        double precision, dimension(:), pointer :: a 
        end subroutine boink
      end interface boink
   !
      call boink(xyz)
      deallocate(xyz)
   end subroutine bla
end module call_test

在另一个模块中我有:

module test
   contains
   subroutine boink(a) 
      implicit none 
      double precision, dimension(:), pointer:: a 
      allocate(a(10))
   end subroutine boink
end module test

它工作正常,但问题是每次都执行此过程,即多次调用子例程bla,我分配一些不会被释放的内存,这会导致内存问题。在第一个模块中使用后,有没有办法在第二个模块中释放数组“a”?

2 个答案:

答案 0 :(得分:2)

如果在没有重新分配的情况下多次分配相同的指针,那么这只会是一个问题。您可以更改分配部分以首先检测指针是否已经分配:

if(associated(a))deallocate(a)
allocate(a(10))

当然,如果您将a指向无法解除分配的其他变量b,则会导致一些严重问题。

如果您需要的a只是一个可调整大小的数组,那么最好将其设为allocatable而不是pointer。这样你就不会有内存泄漏。

答案 1 :(得分:1)

“bla”调用“boink”`,它分配一个指针数组。然后“bla1”解除分配。没有内存泄漏。两个过程对同一个指针数组使用不同的名称并不重要。

当模块use的模块“test”包含“boink”时,为什么模块“call_test”中有“boink”接口? use将使模块“call_test”中的“boink”界面为已知。