这是一个有趣的问题,似乎没有明显的解决方案。在将指针分配为 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)
几件事:
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 )
其他几个数组以相同的方式分配、填充和释放。没有问题。如果我注释掉
deallocate(adj_local_area)
,代码运行良好,直到它尝试退出子例程并清除堆 - 它崩溃并显示相同的消息。我最初认为这是一个类型的事情(例如,
real*8
被写入real*4
向量中),但是放入数组中的值都是PetscReal
,与向量本身的类型相同(我相信PetscReal
是按照我的配置编译real*4
的)。
有任何想法吗?如果您需要更多代码,请告诉我,我可以提供。