2010-06-07 224 views
1

這段代碼有什麼問題?它每次都會崩潰。多次調用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

回答

1

你在搗毀堆。 realloc可以自由選擇從一個完全不同的位置返回你的記憶,因爲它重新分配,這是無效的ptr。重新分配後設置ptr

+0

是的..寫完後,貼着我的眼睛..我想所有需要得到答案的是寫一篇文章......特別是如果你正在調試你的應用程序近4個小時才能發現問題。 :D謝謝! – Windindeed 2010-06-07 21:11:27

0

在這裏循環的第二次迭代是值

  • data點大小sizeof(buf)
  • size的緩衝液具有給定這些值的值的sizeof(buf)

的值ptr是它指向分配給data的緩衝區的末尾。這是內存不屬於該進程,並且以下memcpy操作會寫入此內存並損壞內存。

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

在這裏調用realloc()可能會釋放舊的緩衝區,然後再返回新的緩衝區。