我看到了这个问题:
并且被接受的答案让我怀疑我是否安全地编写了以下函数(而不允许内存泄漏)。
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操作系统。当我按下CTRL-ALT-DEL并查看性能时,“物理内存使用情况历史记录”会在每次循环迭代时增加。因此,我认为我有一个内存泄漏问题。
所以我想重新提出我的问题:这是内存泄漏吗?(每个上述情况的内存都会增加)。如果是,那么有没有办法在仍然使用指针的情况下避免内存泄漏?如果不是,那么到底发生了什么,我应该担心吗?是否有一种方法可以降低这种行为的严重程度?
很抱歉初次提问比较含糊。希望现在更加明确了。