Fortran 肯定是valgrind失忆了
我有下面的Fortran代码的这一部分,在Fortran 肯定是valgrind失忆了,fortran,valgrind,Fortran,Valgrind,我有下面的Fortran代码的这一部分,在allocate(temp)中,valgrind明确提到了内存丢失。我分配这些数据的方式是否有任何错误 subroutine insert_linked_list_grids(l,ncell,nclust,corner,headlev) implicit none integer :: ig, jg, kg, k, l, m1, m2, m3, nx, ny, nz, ncell, & nclust, bsau
allocate(temp)
中,valgrind明确提到了内存丢失。我分配这些数据的方式是否有任何错误
subroutine insert_linked_list_grids(l,ncell,nclust,corner,headlev)
implicit none
integer :: ig, jg, kg, k, l, m1, m2, m3, nx, ny, nz, ncell, &
nclust, bsaux, bnaux, bwaux, beaux, bbaux, btaux
double precision :: dx, dy, dz, dxaux, dyaux, dzaux
double precision, dimension(24,maxcl) :: corner
type(level_components1), pointer :: temp, curr
type(level_components1), dimension(ltop), target :: headlev
dx = headlev(l)%hx
dy = headlev(l)%hy
dz = headlev(l)%hz
dxaux = headlev(l-1)%hx
dyaux = headlev(l-1)%hy
dzaux = headlev(l-1)%hz
!nullify(headlev(l)%next)
curr => headlev(l)
headlev(l)%npatches = 0
!calculating ix, iy, iz, mx, my, mz
write(*,*) 'total number of cluster =', nclust
do k=1,nclust
headlev(l)%npatches = headlev(l)%npatches +1
ig = nint(r*(corner(1,k) - 0.5d0*dxaux - a1)/dxaux ) + 1
jg = nint(r*(corner(2,k) - 0.5d0*dyaux - a2)/dyaux ) + 1
kg = nint(r*(corner(3,k) - 0.5d0*dzaux - a3)/dzaux ) + 1
!write(*,*) "cluster = ", k,"ig = ", ig,"jg = ", jg,&
! "kg = ",kg
nx = nint(r*(corner(10,k)-corner(1,k) + dxaux)/dxaux)
ny = nint(r*(corner(5,k)-corner(2,k) + dyaux)/dyaux)
nz = nint(r*(corner(15,k)-corner(3,k) + dzaux)/dzaux)
!write(*,*) "cluster = ", k,"nx = ", nx,"ny = ", ny,&
! "nz = ",nz
call bc_linked_list(ig,jg,kg,nx,ny,nz,dx,dy,dz,bwaux,beaux,&
bsaux,bnaux,bbaux,btaux,headlev)
allocate(temp)
temp%grid%ix = ig
temp%grid%iy = jg
temp%grid%iz = kg
temp%grid%mx = nx
temp%grid%my = ny
temp%grid%mz = nz
temp%grid%iu = 1 + ncell
temp%grid%bw = bwaux
temp%grid%be = beaux
temp%grid%bs = bsaux
temp%grid%bn = bnaux
temp%grid%bb = bbaux
temp%grid%bt = btaux
m1 = temp%grid%mx + 1 + 2*nbc
m2 = temp%grid%my + 1 + 2*nbc
m3 = temp%grid%mz + 1 + 2*nbc
ncell = ncell + m1*m2*m3
nullify(temp%next)
curr%next => temp
curr => temp
end do
return
end subroutine insert_linked_list_grids
我希望valgrind会警告您,当子例程返回
temp
时,它超出了范围,实际上已被读取,但temp
指向的内存未被读取;对我来说,这看起来像是一个规范的内存泄漏
您可以在子例程结束之前取消分配temp
或者您可以使
temp
成为可分配数组,在这种情况下,编译器负责生成代码,在子例程返回时获取分配的内存。一般来说,使用现代(Fortran 2003)编译器,可分配
比指针
更能动态管理内存,因为编译器负责内存释放。当然,在某些情况下,只有一个指针就可以了。我希望valgrind会警告您,当子例程返回temp
时,它超出了范围,实际上已经被占用,但是temp
指向的内存没有被占用;对我来说,这看起来像是一个规范的内存泄漏
您可以在子例程结束之前取消分配temp
或者您可以使
temp
成为可分配数组,在这种情况下,编译器负责生成代码,在子例程返回时获取分配的内存。一般来说,使用现代(Fortran 2003)编译器,可分配
比指针
更能动态管理内存,因为编译器负责内存释放。当然,在某些情况下,只有一个指针就可以了。我希望valgrind会警告您,当子例程返回temp
时,它超出了范围,实际上已经被占用,但是temp
指向的内存没有被占用;对我来说,这看起来像是一个规范的内存泄漏
您可以在子例程结束之前取消分配temp
或者您可以使
temp
成为可分配数组,在这种情况下,编译器负责生成代码,在子例程返回时获取分配的内存。一般来说,使用现代(Fortran 2003)编译器,可分配
比指针
更能动态管理内存,因为编译器负责内存释放。当然,在某些情况下,只有一个指针就可以了。我希望valgrind会警告您,当子例程返回temp
时,它超出了范围,实际上已经被占用,但是temp
指向的内存没有被占用;对我来说,这看起来像是一个规范的内存泄漏
您可以在子例程结束之前取消分配temp
或者您可以使
temp
成为可分配数组,在这种情况下,编译器负责生成代码,在子例程返回时获取分配的内存。一般来说,使用现代(Fortran 2003)编译器,可分配
比指针
更能动态管理内存,因为编译器负责内存释放。当然,在某些情况下,只有一个指针就可以了。包括您正在使用的编译器以及确切的错误是什么可能会有所帮助。==26020==1440字节在丢失记录20 Of 45==26020==at 0x4C2ABED:malloc(在/usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so中)代码运行了很长一段时间后,我得到的错误是一个分段错误,我希望出现在这个子例程中,只要我在Valgrind上得到的唯一错误是编译器是intel 13.0,看起来这个过程创建了一个链表。大概在某个地方有代码“取消创建”这个列表。如果没有,那就是你的问题了。包括你正在使用的编译器和确切的错误可能会有帮助。==26020==1440字节在15个块中肯定会丢失在丢失记录20 of 45==26020==at 0x4C2ABED:malloc(in/usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)我在代码运行了很长时间后得到的错误,这是一个分段错误,我希望出现在这个子程序中,只要这是我在Valgrind上得到的唯一错误编译器是intel 13.0,看起来这个过程创建了一个链表。大概在某个地方有代码“取消创建”这个列表。如果没有,那就是你的问题了。包括你正在使用的编译器和确切的错误可能会有帮助。==26020==1440字节在15个块中肯定会丢失在丢失记录20 of 45==26020==at 0x4C2ABED:malloc(in/usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)我在代码运行了很长时间后得到的错误,这是一个分段错误,我希望出现在这个子程序中,只要这是我在Valgrind上得到的唯一错误编译器是intel 13.0,看起来这个过程创建了一个链表。大概在某个地方有代码“取消创建”这个列表。如果没有,那就是你的问题了。包括你正在使用的编译器和确切的错误可能会有帮助。==26020==1440字节在15个块中肯定会丢失在丢失记录20 of 45==26020==at 0x4C2ABED:malloc(in/usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)我在代码运行了很长时间后得到的错误,这是一个分段错误,我希望出现在这个子程序中,只要这是我在Valgrind上得到的唯一错误编译器是intel 13.0,看起来这个过程创建了一个链表。大概在某个地方有代码“取消创建”这个列表。如果没有-这就是你的问题。取消分配会取消分配,但取消分配不一定是取消分配。取消分配会取消分配,但取消分配不一定是取消分配。取消分配会取消分配