我正在使用指针将一些数组传递给子程序,然后在该子程序中分配该数组并将其发送回第一个子程序。在一个模块中,我有类似的东西:
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”?
答案 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”界面为已知。