【发布时间】:2014-07-24 03:15:07
【问题描述】:
我看到了这个问题:
接受的答案让我怀疑我是否安全地编写了以下函数(不允许内存泄漏)
function getValues3D(this) result(vals3D)
implicit none
type(allBCs),intent(in) :: this
real(dpn),dimension(:,:,:),pointer :: vals3D
integer,dimension(3) :: s
if (this%TF3D) then
s = shape(this%vals3D)
if (associated(this%vals3D)) then
stop "possible memory leak - p was associated"
endif
allocate(vals3D(s(1),s(2),s(3)))
vals3D = this%vals3D
else; call propertyNotAssigned('vals3D','getValues3D')
endif
end function
当我运行我的代码时会出现这个警告,但如果我之前(到这个函数)设置了我的this%vals3D,不应该关联它吗?我目前遇到内存错误,当我引入一个包含此功能的新模块时,它们开始出现。
非常感谢任何帮助。
我认为我不够具体。我想制作以下课程,并知道如何在内存方面安全地实现该课程。那就是:
module vectorField_mod
use constants_mod
implicit none
type vecField1D
private
real(dpn),dimension(:),pointer :: x
logical :: TFx = .false.
end type
contains
subroutine setX(this,x)
implicit none
type(vecField1D),intent(inout) :: this
real(dpn),dimension(:),target :: x
allocate(this%x(size(x)))
this%x = x
this%TFx = .true.
end subroutine
function getX(this) result(res)
implicit none
real(dpn),dimension(:),pointer :: res
type(vecField1D),intent(in) :: this
nullify(res)
allocate(res(size(this%x)))
if (this%TFx) then
res = this%x
endif
end function
end module
下面的代码测试这个模块的地方
program testVectorField
use constants_mod
use vectorField_mod
implicit none
integer,parameter :: Nx = 150
real(dpn),parameter :: x_0 = 0.0
real(dpn),parameter :: x_N = 1.0
real(dpn),parameter :: dx = (x_N - x_0)/dble(Nx-1)
real(dpn),dimension(Nx) :: x = (/(x_0+dble(i)*dx,i=0,Nx-1)/)
real(dpn),dimension(Nx) :: f
real(dpn),dimension(:),pointer :: fp
type(vecField1D) :: f1
integer :: i
do i=1,Nx
f(i) = sin(x(i))
enddo
do i=1,10**5
call setX(f1,f) !
f = getX(f1) ! Should I use this?
fp = getX(f1) ! Or this?
fp => getX(f1) ! Or even this?
enddo
end program
目前,我在 Windows 上运行。当我 CTR-ALT-DLT 并查看性能时,“物理内存使用历史”会随着每次循环迭代而增加。这就是为什么我假设我有内存泄漏。
所以我想提出我的问题:这是内存泄漏吗? (内存随着上述每一种情况而增加)。如果是这样,有没有办法在仍然使用指针的同时避免内存泄漏?如果不是,那么发生了什么,我应该担心吗?有没有办法降低这种行为的严重性?
很抱歉最初的含糊问题。我希望这更重要。
【问题讨论】:
-
我建议尽可能远离返回指针的函数。它们很容易出错。
-
可以公平地说,在子程序中返回指针可以更安全地实现吗?我在下面的评论中提到,我必须使用指针..
-
是的,使用子例程或可分配对象
标签: pointers memory memory-management fortran fortran90