Memory management 使用ALLOCATE和SegFault错误
我正在使用gfortran编译器(Ubuntu/Linaro 4.6.1-9ubuntu3)4.6.1编译一些FORTRAN 90代码 在编译代码之后,当我试图运行程序时,我遇到了一个分段错误。使用Valgrind后,我能够在下面的代码部分找到问题。可以看出,在没有前面的分配的情况下使用了解除分配。我应该注意的是,我不是编写此软件的人,它是使用f90成功编译的,但是我不再能够访问编写/编译此软件的原始计算机Memory management 使用ALLOCATE和SegFault错误,memory-management,segmentation-fault,fortran,Memory Management,Segmentation Fault,Fortran,我正在使用gfortran编译器(Ubuntu/Linaro 4.6.1-9ubuntu3)4.6.1编译一些FORTRAN 90代码 在编译代码之后,当我试图运行程序时,我遇到了一个分段错误。使用Valgrind后,我能够在下面的代码部分找到问题。可以看出,在没有前面的分配的情况下使用了解除分配。我应该注意的是,我不是编写此软件的人,它是使用f90成功编译的,但是我不再能够访问编写/编译此软件的原始计算机 CONTAINS !! NewSiteType --------------
CONTAINS
!! NewSiteType --------------------------------------------------------------------------
---
!!
!!- Searches for the index of a particular atom label
!!
FUNCTION NewSiteType(top,name,mass)
IMPLICIT NONE
!-------- function parameters ----------------
INTEGER :: NewSiteType
TYPE(TTopology), INTENT(INOUT) :: top
CHARACTER(*), INTENT(IN) :: name
REAL*8, INTENT(IN) :: mass
!-------- local variables --------------------
TYPE(TSiteType), DIMENSION(SIZE(top%siteTypes)+1) :: tmp
INTEGER :: i
NewSiteType = 0
! check if a site type was already registered
DO i = 1,SIZE(top%siteTypes)
IF (top%siteTypes(i)%name == name) THEN
NewSiteType = i
RETURN
END IF
END DO
! no, enlarge the list by the current one
! adding in an ALLOCATE to address a segfault problem hopefully
ALLOCATE(top%siteTypes(SIZE(tmp)))
tmp(1:SIZE(top%siteTypes)) = top%siteTypes
DEALLOCATE(top%siteTypes)
ALLOCATE(top%siteTypes(SIZE(tmp)))
top%siteTypes = tmp
top%siteTypes(SIZE(top%siteTypes)) = TSiteType(name,mass)
NewSiteType = SIZE(top%siteTypes)
END FUNCTION NewSiteType
为了解决这个问题,我添加了行
ALLOCATE(top%siteTypes(SIZE(tmp)))
这修复了Segfault问题,但现在该功能无法正常工作。它用于获取输入并搜索数组,如果输入不在数组中,则添加它。但是,现在我已经添加了初始分配,它似乎并没有像预期的那样向数组添加未注册的输入。我认为这是因为当程序试图使用尚未注册的站点时,会产生一个特定的错误。由于这是我所做的唯一更改,我猜我只是做了一些错误的事情,添加了分配
我想提一件事。当我最初运行Valgrind来查找内存问题时,它实际上似乎像应该的那样运行整个可执行文件?我觉得这很奇怪 行的顺序
ALLOCATE(top%siteTypes(SIZE(tmp)))
tmp(1:SIZE(top%siteTypes)) = top%siteTypes
没有道理。第一个为top%的站点类型保留内存,第二个通过将变量放在赋值的RHS上使用该内存的内容,但该变量尚未初始化。将allocate语句定位到您拥有它的位置并不能解决由于上面使用了该变量而未被分配的问题
问题可能不在此函数范围内,该函数显然假定已分配并初始化top%的站点类型。“inout”的意图表明变量top是用来输入(和输出)的,而在输入时进行分配将删除变量的内容,使其成为有效的唯一输出。您可以通过“if(.not.allocated(top%siteTypes))…”检查是否未分配行序列
ALLOCATE(top%siteTypes(SIZE(tmp)))
tmp(1:SIZE(top%siteTypes)) = top%siteTypes
没有道理。第一个为top%的站点类型保留内存,第二个通过将变量放在赋值的RHS上使用该内存的内容,但该变量尚未初始化。将allocate语句定位到您拥有它的位置并不能解决由于上面使用了该变量而未被分配的问题
问题可能不在此函数范围内,该函数显然假定已分配并初始化top%的站点类型。“inout”的意图表明变量top是用来输入(和输出)的,而在输入时进行分配将删除变量的内容,使其成为有效的唯一输出。您可以通过“if(.not.allocated(top%siteTypes))…”检查是否未分配