多次调用realloc()似乎会导致堆损坏
问题描述:
这段代码有什么问题?它每次都会崩溃。多次调用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
。
+0
是的..写完后,贴着我的眼睛..我想所有需要得到答案的是写一篇文章......特别是如果你正在调试你的应用程序近4个小时才能发现问题。 :D谢谢! – Windindeed 2010-06-07 21:11:27
答
在这里循环的第二次迭代是值
-
data
点大小sizeof(buf)
-
size
的缓冲液具有给定这些值的值的sizeof(buf)
的值ptr
是它指向分配给data
的缓冲区的末尾。这是内存不属于该进程,并且以下memcpy
操作会写入此内存并损坏内存。
答
char *ptr = data + size;
char *tmp = (char*)realloc(data, size);
memcpy(ptr, buf, sizeof(buf));
在这里调用realloc()
可能会释放旧的缓冲区,然后再返回新的缓冲区。
(抱歉虚幻编辑)真正的问题是:为什么你在C++中使用realloc?这就是'std :: vector'的用途。 – 2010-06-07 21:07:40
在现实中,我正在写一堂课..内存是在破坏中释放的,所以不会有任何伤害。 std :: vector对于这个特定的目的太重了。 – Windindeed 2010-06-07 21:15:24
你认为“矢量”的“重量”究竟是什么?在现实中,即使稍微小心一点,它几乎总是会比这更快(比较小的代码很可能)。 – 2010-06-07 21:36:29