完美解決:HEAP: Free Heap block XXX modified at XXX after it was freed
前言
內(nèi)存分配釋放代碼,容易出現(xiàn)這種問題杨赤。主要原因:內(nèi)存已經(jīng)被釋放后敞斋,還繼續(xù)調(diào)用
出現(xiàn)這樣問題的根本原因就是野指針,即:對已經(jīng)釋放了的內(nèi)存進(jìn)行寫操作
幾個(gè)案例
案例一疾牲、如下:
float* f= new float [d];
for(int g=0;g<10;g++){//關(guān)注公眾號(hào):小千哥
for(int i=0;i<d;i++){
f[i]=0;
}
delete[] f;
}
解決方式:
g=1執(zhí)行delete[] f;會(huì)報(bào)錯(cuò)
因?yàn)椋篺分配的內(nèi)存在g=0是就已經(jīng)被刪除了植捎,變成了野指針,所以第二次循環(huán)時(shí)無法再次刪除阳柔。
案例二焰枢、如下:
int* h = new int;
int* yo = h;//關(guān)注公眾號(hào):小千哥
delete h;
*yo= 1; //給野指針賦值
在野指針賦值后,下次內(nèi)存分配盔沫,分配到上yo所指地址段医咨,DEBUG調(diào)試時(shí),就會(huì)出現(xiàn)Free Heap block 公眾號(hào)小千哥 modified at YYY after it was freed提示架诞。
最終解決
剛開始以為是多線程的問題,研究了好久干茉,網(wǎng)上文章都沒用谴忧。
最后發(fā)現(xiàn)是獲取getInhook(),我以前釋放掉了。
之后又調(diào)用了沾谓,就出現(xiàn)這種情況了委造。