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

时间:2010-06-07 20:56:17

标签: c++ realloc heap-corruption

此代码有什么问题?它每次都崩溃。

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

更改缓冲区大小会以某种奇怪的方式影响此问题 - 有时会在“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);

谢谢!

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

  • data指向大小为sizeof(buf)
  • 的缓冲区
  • size的值为sizeof(buf)

给定这些值,ptr的值是指向分配到data的缓冲区的末尾。这是不属于进程的内存,并且以下memcpy操作会写入此内容并破坏内存。

答案 2 :(得分:0)

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

此处对realloc()的调用可能会在返回新缓冲区之前释放旧缓冲区。