昨天在調(diào)程序時(shí),發(fā)現(xiàn)了一個(gè)問(wèn)題,在Debug模式下出現(xiàn)Debug Error!DAMAGE:after Normal block (#xxxx)錯(cuò)誤,Release沒(méi)問(wèn)題。網(wǎng)上一搜,知道這是由越界訪問(wèn)內(nèi)存,破壞了內(nèi)存中其他數(shù)據(jù)而引起問(wèn)題。但大部分帖子介紹這個(gè)問(wèn)題都是由動(dòng)態(tài)申請(qǐng)內(nèi)存和動(dòng)態(tài)釋放引起。而我的程序中根本沒(méi)有用過(guò)new和delete;也有一個(gè)帖子說(shuō)數(shù)組越界也會(huì)發(fā)生這種情況,我又查了很多遍,數(shù)組都正常。只好繼續(xù)調(diào)代碼,最后被我跟到一個(gè)調(diào)用的DLL(DLL也是自己寫的)里面,并且鎖定在一行代碼上:
ModelName = strcat(ModelName,".txt"); // ModelName的類型是char *
這里ModelName是從調(diào)用DLL的類的實(shí)例中傳過(guò)來(lái)的一個(gè)字符串指針,在DLL中由于上面的語(yǔ)句,導(dǎo)致調(diào)用處的字符指針越界,從而產(chǎn)生了這個(gè)錯(cuò)誤。因?yàn)镽elease沒(méi)有內(nèi)存越界提示,所以沒(méi)有發(fā)現(xiàn)這個(gè)問(wèn)題,但這樣的內(nèi)存隱患足以致命。可見(jiàn)操作指針內(nèi)存小心為上,故慎重的把它記錄下來(lái)。

這里ModelName是從調(diào)用DLL的類的實(shí)例中傳過(guò)來(lái)的一個(gè)字符串指針,在DLL中由于上面的語(yǔ)句,導(dǎo)致調(diào)用處的字符指針越界,從而產(chǎn)生了這個(gè)錯(cuò)誤。因?yàn)镽elease沒(méi)有內(nèi)存越界提示,所以沒(méi)有發(fā)現(xiàn)這個(gè)問(wèn)題,但這樣的內(nèi)存隱患足以致命。可見(jiàn)操作指針內(nèi)存小心為上,故慎重的把它記錄下來(lái)。