記憶體的一些magic number和debug crt

來源:互聯網
上載者:User

調試過debug版本的vc程式的人一定對0xCCCCCCCC和0xCDCDCDCD這樣的記憶體很有印象。這是debug版本的CRT為了方便偵錯工具,在分配出來還沒有初始化的時候提供的初始值。

實際上,Windows上面還有更多這樣的初始值,見下表:

Uninitialized

 

BAADF00D

Used by Microsoft's LocalAlloc/GlobalAlloc/HeapAlloc(LMEM_FIXED) to mark uninitialised allocated heap memory

CCCCCCCC

Used by Microsoft's C++ debugging runtime library to mark uninitialised stack memory

CDCDCDCD

Used by Microsoft's C++ debugging runtime library to mark uninitialised heap memory

 

 

Freed

 

FEEEFEEE

Used by Microsoft's LocalFree/GlobalFree/HeapFree() to mark freed heap memory

DDDDDDDD

Used by MicroQuill's SmartHeap and Microsoft's C++ debugging heap to mark freed heap memory

 

 

No man's land

 

ABABABAB

Used by Microsoft's LocalAlloc/GlobalAlloc/HeapAlloc() to mark "no man's land" guard bytes after allocated heap memory

FDFDFDFD

Used by Microsoft's C++ debugging heap to mark "no man's land" guard bytes before and after allocated heap memory

表格來源:http://en.wikipedia.org/wiki/Magic_number_(programming)

除了debug CRT會幫你添加這些初始化值之外,微軟的堆管理函數也會在分配和釋放的時候添加一些初始化值。

LocalAlloc/GlobalAlloc,如果指定的是LMEM_FIXED(預設就指定了這個),並且沒有指定LMEM_ZEROINIT,則分配的記憶體中初始化值為BAADF00D(可以理解成badfood,也就是不能直接吃的意思,呵呵)。調用LocalFree/GlobalFree則其值會變為FEEEFEEE)可以理解成Free)。

HeapAlloc只要沒有指定HEAP_ZERO_MEMORY,也是一樣初始化值是BAADF00D,HeapFree之後則是FEEEFEEE。

另外,windows的三個heap分配函數(LocalAlloc/GlobalAlloc/HeapAlloc)分配記憶體的時候,會在分配的記憶體後面另外添加8個byte的Guard資料,也就是上表中的No man's land。其數值為ABABABAB

 

關於windows的heap管理函數,還有以下兩點需要注意:

  1. 如果分配的記憶體過大(比如幾十M,HeapAlloc會轉換成用VirtualAlloc來分配,而不是從堆上進行分配,所以分配和釋放之後的記憶體值不是上表所示。
  2. 開啟pageheap之後,調用HeapAlloc分配的初始化值為0xc0c0c0c0。HeapFree之後的記憶體則無法訪問

 

如果你的記憶體管理用的是new(malloc)和delete(free)這樣的CRT函數,那麼情況會更複雜一些。這些CRT記憶體管理函數是建立在上面的windows heap管理函數之上的。

尤其是debug版本的CRT,會做更多的事情,詳細見http://www.nobugs.org/developer/win32/debug_crt_heap.html

這裡簡要說明一下,new(malloc)分配的未初始化記憶體的值為CDCDCDCD,delete(free)之後的未初始化值為DDDDDDDD。

另外 ,debug CRT也有跟windows 的 heap管理函數一樣的No man's land資料,他們是FDFDFDFD(可以理解成fence),總共8個bytes,4個byte在payload前面 ,4個byte在payload後面。
需要注意的是CRT的管理資料實際上也是windows的heap管理函數的payload,所以當我們用CRT的函數來分配記憶體時,比如說10bytes,CRT向windows的heap管理函數會需要申請額外的記憶體(大概是40byte,也就是說總共50byte)。這額外的記憶體是CRT用來管理CRT記憶體的,其中就包括No man's land資料,另外還有分配了多少記憶體,記憶體類型,調用分配函數時的檔案名稱和行數等等。詳細這40bytes作和作用請參見上面的URL

 

這裡還有一些關於Debug CRT的更詳細的介紹:http://www.codeguru.com/cpp/w-p/win32/tutorials/article.php/c9535/Inside-CRT-Debug-Heap-Management.htm

 

值得注意的是,以上是Debug CRT才會有的操作,release版本的CRT是直接調用windows的heap manager函數,所以其表現跟使用者直接調用heap manager函數是一樣的

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.