window調試學習3——內存調試

動態內存分配錯誤有以下兩種基本類型:內存錯誤和內存泄露。

當一個指針或者該指針所指向的內存單元成爲無效單元,或者內存中分配的數據結構被破壞時,就會造成內存錯誤。指針未被初始化、指針被初始化爲一個無效地址、指針被不小心錯誤地修改、在與指針相關聯的內存區域被釋放以後使用該指針(這種指針被稱爲虛懸(dangling)指針),這些都會使指針變爲無效指針。當通過一個錯誤指針或者虛懸指針對內存進行寫入,或者是將指針強制轉換爲不匹配的數據結構,又或者是寫數據越界的時候,內存本身也會遭到破壞。刪除未被初始化的指針,刪除非堆指針、多次刪除同一指針或者覆蓋一個指針的內部數據結構,都會造成內存分配系統錯誤。總之,C++中的內存錯誤有無數種可能發生的原因。


寫內存越界

在調試版本里,對內存的寫越界時,如果是寫上溢就會收到“DAMAGE: after block”(內存破壞:在塊的後面)的跟蹤消息,如果是寫下溢就會收到“DAMAGE: before block”(內存破壞:在塊的前面)的跟蹤消息。但是,只有在內存的破壞發生在數據區的前後四個字節裏時,上面的消息纔會出現。如果寫溢出超過了保護字節,對內存的寫越界不會被發現。因爲內存的崩潰通常就發生在內存破壞的後面,所以你可以使用數據斷點對導致崩潰的代碼進行跟蹤。



內存泄漏

內存泄漏在被動態分配的內存沒有被釋放的時候產生。有很多種情況會導致內存地漏,例如沒有在全部的執行路徑中釋放內存(特別是在那些具有多個返回語句和具有異常拋出的函數中),沒有在析構程序中釋放所有的內存,或者是忘記將基類析構函數設記爲虛函數,還有可能是很簡單的情形:忘記釋放內存。

怎樣查看內存泄漏:

在內存中,“VM Size”表示進程在整體上的內存使用量(包括位於物理內存內部和外部的內存),而“Mem Usage”表示進程的物理內存使用量(也稱爲進程的工作集)。通常,發生內存漏洞的徵兆就是在虛擬內存上發生了增長,而不是在工作集上發生了波動。這個可以在任務管理器中查看。



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