最近寫了點(diǎn)C++的代碼,其中也出現(xiàn)過很多奇怪的錯(cuò)誤,heap corruption detected就是其中之一,而且這種錯(cuò)誤很容易出現(xiàn),一般出現(xiàn)該錯(cuò)誤,在debug中都有大致如下的錯(cuò)誤信息:
heap corruption detected:
after normal block(#xxx) at 0x xxxxxxxx
crt detected that the application wrote to menory after end of heap buffer
這是典型的內(nèi)存溢出錯(cuò)誤,常在內(nèi)存的delete處發(fā)生,而且一般在debug版本中可能出現(xiàn),release版本中可能并不報(bào)錯(cuò).
出現(xiàn)這個(gè)錯(cuò)誤的原因一般都是操作new申請的內(nèi)存溢出,因?yàn)樵赾++中,如果用new分配一段內(nèi)存,操作的時(shí)候改變了該部分的大小,在delete時(shí)就會出錯(cuò).比如說如下部分:
char* p=new char[5];
strcpy(p,"aaaaa");
delete[] p;
這段代碼就會出錯(cuò),因?yàn)樯暾埩艘粋€(gè)size為5的內(nèi)存,但是strcpy過去了一個(gè)size為6的字符串,因此破壞了這個(gè)指針,運(yùn)行debug版本的時(shí)候就會出現(xiàn)先前的錯(cuò)誤,但是在release版本中,溢出一個(gè)字節(jié)的內(nèi)存很有可能是沒有錯(cuò)誤的,然后潛在的隱患是肯定存在的,因此,我們在debug遇到這樣的錯(cuò)誤時(shí)候一定要仔細(xì)檢查對new出的指針的操作.