多次调用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()
的调用可能会释放旧的缓冲区,然后返回新的缓冲区。
上一篇: multiple calls to realloc() seems to cause a heap corruption