0

这是一个有趣的问题,似乎没有明显的解决方案。在将指针分配为 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 回答 0