realloc 错误:释放对象的校验和不正确
Posted
技术标签:
【中文标题】realloc 错误:释放对象的校验和不正确【英文标题】:realloc error: incorrect checksum for freed object 【发布时间】:2011-08-04 07:36:47 【问题描述】:我尝试编写从标准输入读取数据的代码:
size_t bufSize = 1024;
unsigned char *msg = NULL;
size_t msgBytes = 0;
size_t inputMsgBufCount = 0;
unsigned char inputBuffer[bufSize];
size_t bytesRead = 0;
unsigned char *tmp = NULL;
if ((msg = (unsigned char *)malloc(sizeof(unsigned char) * bufSize)) == NULL)
exit(EXIT_FAILURE);
bytesRead = fread(msg, sizeof(unsigned char) * bufSize, 1, stdin);
inputMsgBufCount++;
while (bytesRead)
printf("iteration: %lu\n", inputMsgBufCount);
if ( (tmp = (unsigned char *)realloc(msg, (inputMsgBufCount * bufSize) + bufSize)) != NULL )
printf("reallocated\n");
msg = tmp;
inputMsgBufCount++;
else
printf("Ran out of memory\n");
free(msg);
bytesRead = fread(inputBuffer, sizeof(unsigned char) * bufSize, 1, stdin);
memmove((msg + (inputMsgBufCount * bufSize)), inputBuffer, bufSize);
free(msg);
msgBytes = (inputMsgBufCount * bufSize);
gettimeofday(&end, NULL);
printf("%10.6lf [MB/s]\n", (msgBytes / (1<<20)) / ( (end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec) * 1.0e-6f ));
但是在这样运行之后: ~# dd if=/dev/zero bs=1024 count=8 | ./test 我有这个错误:
迭代:1 重新分配 迭代:2 重新分配 迭代:3 重新分配 迭代次数:4 重新分配 迭代次数:5 重新分配 迭代:6 重新分配 迭代次数:7 test(11450) malloc: *** 对象 0x100804008 错误:已释放对象的校验和不正确 - 对象可能在被释放后被修改。 *** 在 malloc_error_break 中设置断点进行调试 中止陷阱谁能帮帮我。
【问题讨论】:
【参考方案1】:inputMsgBufCount
应该在您复制 msg 缓冲区中的数据之后增加。你在第一次阅读时就做对了,但对于其他所有事情,你在重新分配后立即增加它。如果您遵循它的值,则在您进入循环时它是 1。您重新分配给2*bufSize
,并增加inputMsgBufCount
,使其变为2。然后您读取数据,并将其复制到msg+2*bufSize
。这正在破坏您的缓冲区。你应该已经复制到msg+bufSize
。只需延迟增加变量,直到复制数据之后。
另一方面,您可以安全地使用memcpy()
复制数据。 msg
和 inputBuffer
永远不会重叠。实际上,您可能应该完全摆脱inputBuffer
,并在正确的偏移量处直接读入msg
。
【讨论】:
是的,你说得对,非常感谢。这么晚了是我的错,我有点累:D。以上是关于realloc 错误:释放对象的校验和不正确的主要内容,如果未能解决你的问题,请参考以下文章
已释放对象的校验和不正确 - 对象在被释放后可能已被修改。我该如何解决?