一個C++中的Heap Corrupt錯誤的分析

          這兩天一直在研究一個Crash問題,其表現非常明顯就是Memory Heap被破壞了,但是由于破壞堆的現場無法準確定位,發生Crash的地方已經不是現場,所以一直都沒找到原因。最后只好將代碼Roll Back回去,一個一個模塊的試,最終發現問題出現在某一個模塊中指針類型的強制轉換引起的虛函數調用錯誤上。

          錯誤是這樣的,有一個指針是A類型的,被強制轉換為B類型,并且通過B類型調用B的虛函數,但是實際上調用的虛函數地址在A的虛函數表中。由于兩者參數并不相同,所以導致錯誤出現。

          B類型的函數參數中有一個std::vector類型,由于c++遵循cdecl調用約定,所以是由被調用端負責清理堆棧,這時候就會調用std::vector的析構函數,而實際上該參數已經在調用A的虛函數時被破壞了,在執行完這個函數之后,棧是正確的,但是堆已經被std::vector的析構函數破壞,所以出現了heap Corruption的錯誤。

          Heap Corruption是C++開發中非常棘手的一個問題,其引起的Crash有兩點非常難以琢磨:

          1. 在Debug版較難或者不出現,在Release版常常出現

          2. 在Release版本上也是在非現場出現,而且往往在大量釋放內存的地方出現。

          相信應該有比較好C++的Heap Corruption工具,BoundChecker曾經用過,可惜太復雜不會用,不知道有沒有非常有效的檢測Heap Corruption工具。

          posted on 2007-07-24 23:07 雁過無痕 閱讀(1548) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
          博客園   IT新聞   Chat2DB   C++博客   博問  
           
          <2007年7月>
          24252627282930
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          導航

          統計

          常用鏈接

          留言簿(7)

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 集贤县| 清徐县| 乐亭县| 寻甸| 和田市| 苏尼特左旗| 准格尔旗| 玛曲县| 东辽县| 灌阳县| 泸定县| 巩留县| 禄丰县| 岗巴县| 巴林左旗| 新闻| 衡水市| 观塘区| 临夏县| 荔波县| 兴国县| 深州市| 宝兴县| 桐柏县| 土默特右旗| 屏边| 平湖市| 天柱县| 和田县| 潍坊市| 达日县| 石台县| 香格里拉县| 吉安县| 蓝山县| 镇坪县| 阿拉尔市| 安康市| 乐都县| 基隆市| 石泉县|