星期一, 9月 22, 2014

HEAP CORRUPTION DETECTED


發生的時間點在delete時



原因有幾種狀況

大概都是new出來的物件中有使用到char array時

char test[5];
//正常的情況下
test = "12345";
此時delete會正常

(1)取用的字串長度剛好為5時
string str = "12345";
strcpy_s(&test, 5,str.c_str());

因為字串長度為5 copy進去test會沒有空間存放結尾符號
如果透過IDE輔助可以看到test array index 5之後會出現一些奇怪的值
與其他的記憶體連接在一起
最後在delete時刪除超過原先new出來的空間
而導致HEAP CORRUPTION DETECTED

(2)memset、ZeroMemory

做初始化常發生的粗心錯誤

//正常
memset(&test,0,5);
ZeroMemory(&test,5);

//異常
memset(&test,0,6);
ZeroMemory(&test,6);

//預防
memset(&test,0,sizeof(test));
ZeroMemory(&test,sizeof(test));

長度超過時在執行當下不會有問題
編譯時也不會報錯
可是在delete階段就會報錯HEAP CORRUPTION DETECTED



這個大概都算比較粗心的bug
在codereview階段沒有認真的下去檢查
因為填錯長度 (我自己是sizeof到類似命名struct包裝的資料結構XD)
發生crash的時候真的會找死人
如果您也到相同的問題
不妨從char array、memset及ZeroMemory下去追蹤
看是不是也是帶入的長度overflow了