複製鏈接
請複製以下鏈接發送給好友

CMemoryState

鎖定
CMemoryState提供了便利的方式以檢測程序中的“內存空洞”。“內存空洞”發生於已經為一個對象分配了內存,而在長期不再需要時也沒有釋放。這樣的內存空洞最終可能導致內存溢出錯誤。
中文名
CMemoryState
特    點
沒有基類
提供了
內存空洞
導    致
內存溢出錯誤
CMemoryState類沒有基類
有幾種方式來為程序分配或重新分配內存:
·使用運行庫中的函數的malloc/free家族。·使用Windows API內存管理函數LocalAlloc/LocalFree和GlobalAlloc/Global Free。·使用C++ new和delete操作。
CMemoryState 診斷只能用於幫助檢測內存空洞,該空洞的產生是由於使用new操作分配了內存而沒有使用delete進行刪除。另外兩組內存管理函數是針對非C++程序的,不推薦在同一程序中將它們與new/delete混合使用。當需要文件及內存分配的行跟蹤,那麼提供一個附加的宏DEBUG_NEW來替換new操作。通常,不管是否使用了new操作,都需要使用DEBUG_NEW宏。
與其它診斷相同,CMemoryState診斷也僅僅在程序的調試版中有效。
調試版必須有_DEBUG常量定義。
如果懷疑程序中有內存空洞,那麼可以使用Checkpoint, Difference及DumpStatistics 函數來找出程序執行完成後,兩個不同點之間內存狀態(分配內存的對象)的不同。該信息對於決定函數是否清除了所有分配內存的對象非常有用。
如果僅僅知道當內存分配或內存釋放時不均衡發生於何處,它並沒有提供足夠的信息,因此可以使用DumpAllObjectSince函數來轉儲自從前一次調用Checkpoint函數以來分配的所有對象。這種轉儲顯示了內存分配次序,源文件及被分配對象所在的行(條件是使用了DEBUG_NEW)以及派生對象、其地址、大小。DumpAllObjectSince對象也調用了每一個對象的Dump函數以提供有關的信息。
注意:
CMemoryState類型的對象聲明以及成員函數的調用必須用#ifdefined(_DEBUG)/#endif括起來,以便僅在程序的調試版本中包含內存診斷。
CMemoryState類的成員
CMemoryState構造一個控制內存檢查點的似類結構Checkpoint取得當前內存狀態的一個快照或“檢查點”
操作
Difference計算兩個CMemoryState類型的對象之間的差異DumpAllObjectsSince從前一個檢查點開始轉儲所有分配對象的摘要DumpStatistics打印一個CMemoryState 對象的內存分配統計信息