多次调用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); 

谢谢!

+1

(抱歉虚幻编辑)真正的问题是:为什么你在C++中使用realloc?这就是'std :: vector'的用途。 – 2010-06-07 21:07:40

+1

在现实中,我正在写一堂课..内存是在破坏中释放的,所以不会有任何伤害。 std :: vector对于这个特定的目的太重了。 – Windindeed 2010-06-07 21:15:24

+1

你认为“矢量”的“重量”究竟是什么?在现实中,即使稍微小心一点,它几乎总是会比这更快(比较小的代码很可能)。 – 2010-06-07 21:36:29

你在捣毁堆。 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()可能会释放旧的缓冲区,然后再返回新的缓冲区。