Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran 肯定是valgrind失忆了_Fortran_Valgrind - Fatal编程技术网

Fortran 肯定是valgrind失忆了

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

我有下面的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, 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,看起来这个过程创建了一个链表。大概在某个地方有代码“取消创建”这个列表。如果没有-这就是你的问题。取消分配会取消分配,但取消分配不一定是取消分配。取消分配会取消分配,但取消分配不一定是取消分配。取消分配会取消分配