多次调用realloc()似乎会导致堆损坏

这段代码有什么问题? 它每次都会崩溃。

有一次,它是一个失败的断言“_ASSERTE(_CrtIsValidHeapPointer(pUserData));”,其他时候它只是一个“堆错误”错误。

改变缓冲区大小会以一些奇怪的方式影响这个问题 - 有时它会在“realloc”上崩溃,而其他时间会在“free”上崩溃。

我已经调试过这段代码很多次了,关于指针没有任何异常。

char buf[2000];
char *data = (char*)malloc(sizeof(buf));
unsigned int size = sizeof(buf);

for (unsigned int i = 0; i < 5; ++i)
{
 char *ptr = data + size;
 size += sizeof(buf);
 char *tmp = (char*)realloc(data, size);
 if (!tmp)
 {
  std::cout << "Oh no..";
  break;
 }
 data = tmp;
 memcpy(ptr, buf, sizeof(buf));
}

free(data);

谢谢!


你在捣毁堆。 realloc可以自由选择从它完全不同的位置返回你的内存,因为它重新分配,这是无效的你的ptr 。 重新分配后设置ptr


在循环的第二次迭代中,这里是值

  • data指向sizeof(buf)大小的sizeof(buf)
  • size的值为sizeof(buf)
  • 给定这些值, ptr的值是它指向分配给data的缓冲区的末尾。 这是不属于该进程的内存,下面的memcpy操作会写入此内存并损坏内存。


    char *ptr = data + size;
    char *tmp = (char*)realloc(data, size);
    memcpy(ptr, buf, sizeof(buf));
    

    这里对realloc()的调用可能会释放旧的缓冲区,然后返回新的缓冲区。

    链接地址: http://www.djcxy.com/p/82299.html

    上一篇: multiple calls to realloc() seems to cause a heap corruption

    下一篇: ptr in VC6 dll cause crash