这是一个似乎没有明显解决方案的有趣问题。在将指针分配为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
,我相信。)
有什么想法吗?如果您需要更多代码,我可以提供。