Pointers fortran 90递归子程序指针
我有一个子例程,我希望被递归调用,但调用它时似乎存在内存泄漏。我已经发布了关于函数内存泄漏的问题 但现在我有了一个新问题。我已经将所有函数都切换到了子例程,现在递归调用子例程时遇到了问题。这是我的代码(对不起,不短) 在主程序中,我有Pointers fortran 90递归子程序指针,pointers,recursion,memory-leaks,fortran,fortran90,Pointers,Recursion,Memory Leaks,Fortran,Fortran90,我有一个子例程,我希望被递归调用,但调用它时似乎存在内存泄漏。我已经发布了关于函数内存泄漏的问题 但现在我有了一个新问题。我已经将所有函数都切换到了子例程,现在递归调用子例程时遇到了问题。这是我的代码(对不起,不短) 在主程序中,我有 do k=1,10**4 call myCurl3DRTest(f3,u,v,w,gd,1) !!调用myCurl(f3、u、v、w、gd) 恩多 正如我在前面关于内存泄漏的问题中提到的,这也导致了内存泄漏。有什么东西我忘了分配吗?还是说cu
do k=1,10**4
call myCurl3DRTest(f3,u,v,w,gd,1)
!!调用myCurl(f3、u、v、w、gd)
恩多
正如我在前面关于内存泄漏的问题中提到的,这也导致了内存泄漏。有什么东西我忘了分配吗?还是说curlx、curly和curlz没有从每一个级别上取消分配
很清楚,在deleteField中:
subroutine deleteField(this)
implicit none
type(vecField3D),intent(inout) :: this
if (associated(this%x)) deallocate(this%x)
if (associated(this%y)) deallocate(this%y)
if (associated(this%z)) deallocate(this%z)
this%TFx = .false.
this%TFy = .false.
this%TFz = .false.
end subroutine
在空字段中:
subroutine nullifyField(this)
implicit none
type(vecField3D),intent(inout) :: this
nullify(this%x); this%TFx = .false.
nullify(this%y); this%TFy = .false.
nullify(this%z); this%TFz = .false.
this%TFNullified = .true.
end subroutine
非常感谢您的帮助 我根据您之前的文章猜测,在setX(和类似的)过程中,您分配了作为第一个参数传递的
d3
对象的一些指针组件。我看不出在循环的下一次迭代之前,或者在嵌套调用myCurl3DRTest
之前,如何通过释放来匹配这些指针分配。根据您试图执行的操作,这些释放可能通过调用nullifyField
提供
如果我的猜测是正确的,那么如果没有这些释放,您将有内存泄漏
Fortran 95的语言级别加上可分配的TR将使您的生活变得更加轻松…是的,结果证明在其中一个子例程中没有取消分配。。我想迁移到F95,我可能。。
subroutine nullifyField(this)
implicit none
type(vecField3D),intent(inout) :: this
nullify(this%x); this%TFx = .false.
nullify(this%y); this%TFy = .false.
nullify(this%z); this%TFz = .false.
this%TFNullified = .true.
end subroutine