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
是一个可调整大小的数组,那么最好将其设置为可分配的而不是指针。这样您就永远不会有内存泄漏。您是对的,我不需要使用接口。我跟踪了我的代码,发现这部分应该导致内存泄漏。这意味着我应该再次寻找泄漏的原因。非常感谢你的回复。非常感谢你有用的回复。