HEAP CORRUPTION DETECTED 錯誤原因與解決
阿新 • • 發佈:2021-08-10
一、錯誤如下:
這個錯誤是說在0x01F641A8處發生堆問題,下一句是說在堆buffer末尾記憶體中寫入了數值。
二、錯誤原因
這個問題顯然在動態分配、釋放時記憶體才會發生的。在解決這個問題問題前首要要了解在new和delete時堆中的記憶體是怎麼分配的,是什麼記憶體結構?
引用《c++反彙編與逆向分析技術揭祕》中的內容:
從上面的知識可以看出,在使用new進行堆空間分配的時候,實際上每個堆節點採用雙鏈表的資料結構,在記憶體中賦予一個結構體的記憶體大小,這個結構體包含了上、下一個堆的地址、本次堆資料分配的大小、堆的越界標示符等訊號。
在看看我的程式,其中的一段源程式是:
3、錯誤範例程式碼
出現這種錯誤一般都是使用者指標時,開闢了一塊空間,但是使用時卻超出了這塊範圍,程式在釋放記憶體時找不到堆的越界標示符,無法釋放這塊記憶體導致的錯誤。
如下程式碼,開闢了4個int記憶體,但是使用時,卻使用了後面的4個位元組,就會導致程式崩潰。
#include <iostream> #include <windows.h> int main() { int* nBuff = new int[4]; for (int i = 0; i < 5; i++) { fBuff[i]111= i; } delete []fBuff;
return 0; }