此代码有什么问题?它每次都崩溃。
有一次它是一个失败的断言“_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);
谢谢!
答案 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()
的调用可能会在返回新缓冲区之前释放旧缓冲区。