尽管正确分配和释放,但堆已损坏

时间:2018-04-18 00:32:21

标签: fortran gfortran petsc

这是一个似乎没有明显解决方案的有趣问题。在将指针分配为16个元素的长PetscReal向量,向其填充数据并从中提取数据后,在deallocate()上抛出此错误:

*** Error in `./myprogram': corrupted size vs. prev_size: 0x000000001930d8e0 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x777e5)[0x7f85076667e5]
/lib/x86_64-linux-gnu/libc.so.6(+0x80dfb)[0x7f850766fdfb]
/lib/x86_64-linux-gnu/libc.so.6(cfree+0x4c)[0x7f850767353c]
...

考虑到阵列崩溃的方式设置,我完全不知道如何出现这个错误。

以下是与此问题相关的所有代码段:

PetscReal, allocatable :: adj_temp_area(:), adj_local_area(:)
PetscInt :: temp_int, rec_local_tri

...do unrelated stuff...

rec_local_tri = int(sum(vec_ptr-1))
allocate(adj_local_area(rec_local_tri))
print*,rec_local_tri ! prints out '16'

temp_int=int(maxval(vec_ptr))
allocate(adj_temp_area(temp_int))
print*,temp_int ! prints out '4'

do i=1,grid%num_pts_local
    ...do stuff...
    call MatGetRow(grid%adjmatrix_area,grid%vertex_ids(i)-1,ncols,PETSC_NULL_INTEGER,adj_temp_area,ierr);CHKERRQ(ierr)
    adj_local_area(pos2+1:pos2+temp_int2) = adj_temp_area(2:temp_int)
enddo

print*, adj_local_area ! prints out 16 element array, filled with correct values

! CRASHES HERE!
deallocate(adj_local_area)

有几件事:

  1. adj_local_area已正确填充,其边界不会被覆盖。如果打印出填充数组的行的文字值,您会看到:

     adj_local_area(           1 :           2 ) = adj_temp_area(2:           3 )
     adj_local_area(           3 :           5 ) = adj_temp_area(2:           4 )
     adj_local_area(           6 :           7 ) = adj_temp_area(2:           3 )
     adj_local_area(           8 :           9 ) = adj_temp_area(2:           3 )
     adj_local_area(          10 :          12 ) = adj_temp_area(2:           4 )
     adj_local_area(          13 :          14 ) = adj_temp_area(2:           3 )
     adj_local_area(          15 :          15 ) = adj_temp_area(2:           2 )
     adj_local_area(          16 :          16 ) = adj_temp_area(2:           2 )
    
  2. 以相同的方式分配,填充和释放其他几个数组。没有问题。如果我注释掉deallocate(adj_local_area),代码运行正常,直到它试图退出子程序并清除堆 - 并且它崩溃了相同的消息。

  3. 我最初认为它是一种类型的东西(例如,real*8被写入real*4向量,比如说,但是放入数组的值都是PetscReal,与矢量本身相同的类型(PetscReal编译为我的配置real*4,我相信。)

  4. 有什么想法吗?如果您需要更多代码,我可以提供。

0 个答案:

没有答案