Debug中heapchk.c文件HeapValidate問題

我們在使用VC++進行ATL COM或者MFC開發的時候,如果不注意堆越界的問題,就會遇到_CrtCheckMemory()對Debug堆異常。

比如我遇到的問題:

 

使用MFC的CFileFind類,寫了個遞歸方法,遍歷文件夾查找文件。這個方法前面用起來完全正常,沒有做過修改,後來出現莫名其名的Debug Heap異常,跟蹤到了heapchk.c中的代碼,應該是Debug模式下堆內存出錯了。

 

在方法前面CFileFind filefind;處,就會出現Debug異常對話框。於是將該方法調用附近,所有的變量傳遞和內存申請和釋放重新檢查一遍,最終將該文件遍歷查找方法採用win32 api重新實現,問題得到了解決。很妖的問題,也在網上搜到過其他人相似的問題,有人建議用heapchk中debug heap的若干檢查方法,在代碼不同點驗證,找到問題代碼。以後我再深究這個問題。

 

原因很簡單,肯定是有某個地方操作指針指向的一段內存時發生越界了。Debug方式下, windows對new 和allocate, malloc等申請內存的方法都做了封裝,會在申請到的內存以後附加一段Debug堆數據內存,用以做越界的判斷。之所以在release方式下,不會彈出此異常,是因爲release模式下,c++無法對越界做出判斷,不會報錯,但是可能會對程序產生致命的錯誤。

 

典型的Debug 堆溢出例子爲:

 

  LPTSTR lpcsBuffer = new TCHAR[255];
  memset((void*)lpcsBuffer  , 0,  256);
  _ASSERTE(_CrtCheckMemory());

 

在_ASSERTE(_CrtCheckMemory());處就會拋出HeapValidate異常。其他情況也有。windows會在new, free, delete, 函數返回等地方自己內部調用_ASSERTE(_CrtCheckMemory());,產生讓我們莫名奇妙的問題。

 

這不僅要求我們細心之外,還要不時的在程序各處添加_ASSERTE(_CrtCheckMemory());,來隨時檢查Debug堆是不是異常。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章