在MPI_Recv写入数组后释放该数组

在MPI_Recv写入数组后释放该数组,c,malloc,mpi,free,C,Malloc,Mpi,Free,我用MPI\u Recv MPI_Recv(d.current, n, MPI_INT, 0, TAG_CURRENT_ARRAY, MPI_COMM_WORLD, &status); 我已经测试了d.current在MPI_Recv之前和之后的值,它没有变化(这是正确的) 我的数据正确到达 但是,如果我试图释放数据,我会得到一个错误: *** Error in `./bin/obddhe-mpi': free(): invalid next size (fast): 0x0965e9

我用
MPI\u Recv

MPI_Recv(d.current, n, MPI_INT, 0, TAG_CURRENT_ARRAY, MPI_COMM_WORLD, &status);
我已经测试了
d.current
MPI_Recv
之前和之后的值,它没有变化(这是正确的)

我的数据正确到达

但是,如果我试图
释放
数据,我会得到一个错误:

*** Error in `./bin/obddhe-mpi': free(): invalid next size (fast): 0x0965e988 ***
在接收之前完全相同的免费服务可以完美地工作

即。。。 这项工作:

free(d.current);
//MPI_Recv(d.current, n, MPI_INT, 0, TAG_CURRENT_ARRAY, MPI_COMM_WORLD, &status);
这失败了:

MPI_Recv(d.current, n, MPI_INT, 0, TAG_CURRENT_ARRAY, MPI_COMM_WORLD, &status);
free(d.current);
MPI\u Recv
会做些什么使免费软件无效

A将非常有用

也就是说,我会尽力回答:

我有一个malloc'd整数数组,我用MPI_Recv填充它

MPI_Recv(d.current, n, MPI_INT, 0, TAG_CURRENT_ARRAY, MPI_COMM_WORLD, &status);
那个阵列有多大?你到底是怎么做到的?在这种情况下,什么是
n
,它与
malloc()
ed大小有何关系

您的观察结果表明,
MPI\u Recv()
是发生此错误的原因。为了发生此错误,
MPI_Recv()
已写入
malloc()
ed内存区域的末尾之外,不允许写入该区域。这会弄乱内存管理内部使用的链表或其后面的块大小,或两者都会导致上述错误

我在MPI_Recv之前和之后都测试了d.current的值,它没有变化(这是正确的)

(应该怎么做?您正在将指针传递给函数,而不是它的地址。因此指针无法更改。)

但是,如果我尝试释放数据,则会出现错误:

*** Error in `./bin/obddhe-mpi': free(): invalid next size (fast): 0x0965e988 ***
*在“./bin/obddhe mpi”中出错:free():无效的下一个大小(fast):0x0965e988*

在接收之前完全相同的免费服务可以完美地工作

这是我上面所写的另一个线索:您使用的块后面的meory已被释放,并包含指向下一个可用区域的指针。如果
free()
内存,库会尝试合并空闲块,第二个块已损坏,从而导致此错误

假设您有以下情况:

  • 内存管理器在每个内存块(无论是空闲内存块还是已分配内存块)前面加上其长度
  • 空闲块在开始时有下一个空闲块的地址-这是我提到的链接列表
  • 您分配的块前面有其长度,后面是
    • 一种空闲块,在其长度前面加上前缀,如果没有下一个空闲块,则包含下一个空空闲块的地址
然后,如果写入超过内存块的末尾,下一个块的长度和内容将被触摸和篡改

到目前为止,这对任何事情都没有影响

但是,如果在块上调用
free()
,则此块将与其后面的空闲块合并

为此,必须执行以下操作:

  • 遍历链表以查找相邻的空闲块-这可能会导致此错误,因为第二个空闲块的“下一个”指针是垃圾
  • 从其他块计算较大自由块的大小。如果其中一个包含垃圾,垃圾将被用于计算新的、更大的空闲块大小,而混乱是完美的

谢谢你的提示!您是对的,我溢出了缓冲区(我使用了上一次循环迭代中的大小值)。愚蠢的错误:/+1的答案,但我有一个疑问。即使写入超过分配的内存,也应该只释放使用malloc()分配的内存,即使用malloc()指定的内存大小。此外,这是一个整数数组,而不是以“\0”结尾的字符数组。即使没有free(),错误也有可能只在MPI_Recv()时出现吗?@GauravSaxena没有。如果你覆盖了不属于你的部分内存,任何事情都可能发生。如上所述,大多数内存分配器通过链表管理其空闲内存块和已分配内存块。如果这个被破坏了,这样的事情可能会发生。@glglglgl:我同意,这是一个硬件/软件的糟糕世界。我只是没有标记这个,就像你看起来的那样,你真的花了时间来回答这个问题,但根本没有。这不是答案,是吗?这更像是建议或评论?!