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

Pointers FORTRAN中在子例程内分配数组并将其传回时的内存泄漏问题,pointers,memory-management,fortran,Pointers,Memory Management,Fortran,我使用指针将一些数组传递给一个子例程,然后在该子例程中分配该数组并将其发送回第一个子例程。在一个模块中,我有如下内容: module call_test subroutine bla use test double precision, dimension(:), pointer :: xyz ! interface boink subroutine boink(a) implicit none

我使用指针将一些数组传递给一个子例程,然后在该子例程中分配该数组并将其发送回第一个子例程。在一个模块中,我有如下内容:

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”之后,有没有办法在第二个模块中取消分配该数组?

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


当模块
使用包含“boink”的模块“test”时,为什么在模块“call_test”中有“boink”接口?
使用
将使模块“call_test”中的“boink”接口为人所知。

只有在多次分配同一指针而不解除分配时才会出现问题。您可以将分配部分更改为首先检测指针是否已分配:

if(associated(a))deallocate(a)
allocate(a(10))
当然,如果将
a
指向无法释放的其他变量
b
,这将导致一些严重问题


如果所需的
a
是一个可调整大小的数组,那么最好将其设置为可分配的
而不是
指针。这样您就永远不会有内存泄漏。

您是对的,我不需要使用接口。我跟踪了我的代码,发现这部分应该导致内存泄漏。这意味着我应该再次寻找泄漏的原因。非常感谢你的回复。非常感谢你有用的回复。