青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

微塵--KeepMoving

為了忘卻的記憶
posts - 3, comments - 2, trackbacks - 0, articles - 13
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

(轉)Inside CRT: Debug Heap Manage

Posted on 2008-02-22 20:41 微塵 閱讀(1177) 評論(1)  編輯 收藏 引用

原文來自 CodeGuru

http://www.codeguru.com/cpp/w-p/win32/tutorials/article.php/c9535/ 

Learn how heap management is done in a debug build
Rating:

Marius Bancila (view profile)
April 4, 2005

Environment:  Visual C++ 6.0

 

When you compile a debug build of your program with Visual Studio and run it in debugger, you can see that the memory allocated or deallocated has funny values, such as 0xCDCDCDCD or 0xDDDDDDDD. This is the result of the work Microsoft has put in to detect memory corruption and leaks in the Win32 platform. In this article, I will explain how memory allocation/deallocation is done via new/delete or malloc/free.


 

First, I will explain what all these values that you see, like CD, DD, and so forth, mean.

Value Name Description
0xCD Clean Memory Allocated memory via malloc or new but never written by the application.
0xDD Dead Memory Memory that has been released with delete or free. It is used to detect writing through dangling pointers.
0xFD Fence Memory Also known as "no mans land." This is used to wrap the allocated memory (like surrounding it with fences) and is used to detect indexing arrays out of bounds.
0xAB (Allocated Block?) Memory allocated by LocalAlloc().
0xBAADF00D Bad Food Memory allocated by LocalAlloc() with LMEM_FIXED, but not yet written to.
0xCC   When the code is compiled with the /GZ option, uninitialized variables are automatically assigned to this value (at byte level).

If you take a look at DBGHEAP.C, you can see how some of these values are defined:

static unsigned char _bNoMansLandFill = 0xFD;   /* fill no-man's land with this */static unsigned char _bDeadLandFill   = 0xDD;   /* fill free objects with this */static unsigned char _bCleanLandFill  = 0xCD;   /* fill new objects with this */

Before going any further, take a look at the memory management function that I will refer in this article.

Function Description
malloc C/C++ function that allocates a block of memory from the heap. The implementation of the C++ operator new is based on malloc.
_malloc_dbg Debug version of malloc; only available in the debug versions of the run-time libraries. _malloc_dbg is a debug version of the malloc function. When _DEBUG is not defined, each call to _malloc_dbg is reduced to a call to malloc. Both malloc and _malloc_dbg allocate a block of memory in the base heap, but _malloc_dbg offers several debugging features: buffers on either side of the user portion of the block to test for leaks, a block type parameter to track specific allocation types, and filename/linenumber information to determine the origin of allocation requests.
free C/C++ function that frees an allocated block. The implementation of C++ operator delete is based on free.
_free_dbg Debug version of free; only available in the debug versions of the run-time libraries. The _free_dbg function is a debug version of the free function. When _DEBUG is not defined, each call to _free_dbg is reduced to a call to free. Both free and _free_dbg free a memory block in the base heap, but _free_dbg accommodates two debugging features: the ability to keep freed blocks in the heap's linked list to simulate low memory conditions and a block type parameter to free specific allocation types.
LocalAlloc
GlobalAlloc
Win32 API to allocate the specified number of bytes from the heap. Windows memory management does not provide a separate local heap and global heap.
LocalFree
GlobalFree
Win32 API free the specified local memory object and invalidates its handle.
HeapAlloc Win32 API allocates a block of memory from a heap. The allocated memory is not movable.
HeapFree Win32 API frees a memory block allocated from a heap by the HeapAlloc or HeapReAlloc function.

There are many other functions that deal with memory management. For a complete view please refer to MSDN.

Note: Because this article is about memory management in a debug build, all the references to malloc and free in the following are actually references to their debug versions, _malloc_dbg and _free_dbg.

Compile the following code and run it in the debugger, walking step by step into it to see how memory is allocated and deallocated.

int main(int argc, char* argv[]){   char *buffer = new char[12];   delete [] buffer;   return 0;}

Here, 12 bytes are dynamically allocated, but the CRT allocates more than that by wrapping the allocated block with bookkeeping information. For each allocated block, the CRT keeps information in a structure called _CrtMemBlockHeader, which is declared in DBGINT.H:

#define nNoMansLandSize 4
typedef struct _CrtMemBlockHeader
{        
   struct _CrtMemBlockHeader * pBlockHeaderNext;        
   struct _CrtMemBlockHeader * pBlockHeaderPrev;        
   char
* szFileName;
   int
nLine;
   size_t                      nDataSize;        
   int                         nBlockUse;        
   long
lRequest;
   unsigned
char gap[nNoMansLandSize]; /* followed by: * unsigned char data[nDataSize]; * unsigned char anotherGap[nNoMansLandSize]; */
} _CrtMemBlockHeader;

It stores the following information:

Field Description
pBlockHeaderNext A pointer to the next block allocated, but next means the previous allocated block because the list is seen as a stack, with the latest allocated block at the top.
pBlockHeaderPrev A pointer to the previous block allocated; this means the block that was allocated after the current block.
szFileName A pointer to the name of the file in which the call to malloc was made, if known.
nLine The line in the source file indicated by szFileName at which the call to malloc was made, if known.
nDataSize Number of bytes requested
nBlockUse 0 - Freed block, but not released back to the Win32 heap
1 - Normal block (allocated with new/malloc)
2 - CRT blocks, allocated by CRT for its own use
lRequest Counter incremented with each allocation
gap A zone of 4 bytes (in the current implementation) filled with 0xFD, fencing the data block, of nDataSize bytes. Another block filled with 0xFD of the same size follows the data.

Most of the work of heap block allocation and deallocation are made by HeapAlloc() and HeapFree(). When you request 12 bytes to be allocated on the heap, malloc() will call HeapAlloc(), requesting 36 more bytes.

blockSize = sizeof(_CrtMemBlockHeader) + nSize + nNoMansLandSize;

malloc requests space for the 12 bytes we need (nSize), plus 32 bytes for the _CrtMemBlockHeader structure and another nNoMansLandSize bytes (4 bytes) to fence the data zone and close the gap.

But, HeapAlloc() will allocate even more bytes: 8 bytes below the requested block (that is, at a lower address) and 32 above it (that is, at a bigger address). It also initializes the requested block to 0xBAADF00D (bad food).

Then, malloc() fills the _CrtMemBlockHeader block with information and initializes the data block with 0xCD and no mans land with 0xFD.

Here is a table that shows how memory looks after the call to HeapAlloc() and after malloc() returns. For a complete situation, see the last table. (Note: All values are in hex.)

Address after HeapAlloc() after malloc()
00320FD8
00320FDC
00320FE0
00320FE4
00320FE8
00320FEC
00320FF0
00320FF4
00320FF8
00320FFC
00321000
00321004
00321008
0032100C
00321010
00321014
00321018
0032101C
00321020
00321024
00321028
0032102C
09 00 09 01
E8 07 18 00
0D F0 AD BA
0D F0 AD BA
0D F0 AD BA
0D F0 AD BA
0D F0 AD BA
0D F0 AD BA
0D F0 AD BA
0D F0 AD BA
0D F0 AD BA
0D F0 AD BA
0D F0 AD BA
0D F0 AD BA
AB AB AB AB
AB AB AB AB
00 00 00 00
00 00 00 00
79 00 09 00
EE 04 EE 00
40 05 32 00
40 05 32 00
09 00 09 01
E8 07 18 00
98 07 32 00
00 00 00 00
00 00 00 00
00 00 00 00
0C 00 00 00
01 00 00 00
2E 00 00 00
FD FD FD FD
CD CD CD CD
CD CD CD CD
CD CD CD CD
FD FD FD FD
AB AB AB AB
AB AB AB AB
00 00 00 00
00 00 00 00
79 00 09 00
EE 04 EE 00
40 05 32 00
40 05 32 00

Colors:

  • Green: win32 bookkeeping info
  • Blue: block size requested by malloc and filled with bad food
  • Magenta: _CrtMemBlockHeader block
  • Red: no mans land
  • Black: requested data block

In this example, after the call to malloc() returns, buffer will point to memory address 0x00321000.

When you call delete/free, the CRT will set the block it requested from HeapAlloc() to 0xDD, indicating this is a free zone. Normally after this, free() will call HeapFree() to give back the block to the Win32 heap, in which case the block will be overwritten with 0xFEEEEEEE, to indicate Win32 heap free memory.

You can avoid this by using the CRTDBG_DELAY_FREE_MEM_DF flag to _CrtSetDbgFlag(). It prevents memory from actually being freed, as for simulating low-memory conditions. When this bit is on, freed blocks are kept in the debug heap's linked list but are marked as _FREE_BLOCK. This is useful if you want to detect dangling pointers errors, which can be done by verifying if the freed block is written with 0xDD pattern or something else. Use _CrtCheckMemory() to verify the heap.s integrity.

The next table shows how the memory looks during the free(), before HeapFree() is called and afterwards.

Address Before HeapFree() After HeapFree()
00320FD8
00320FDC
00320FE0
00320FE4
00320FE8
00320FEC
00320FF0
00320FF4
00320FF8
00320FFC
00321000
00321004
00321008
0032100C
00321010
00321014
00321018
0032101C
00321020
00321024
00321028
0032102C
09 00 09 01
5E 07 18 00
DD DD DD DD
DD DD DD DD
DD DD DD DD
DD DD DD DD
DD DD DD DD
DD DD DD DD
DD DD DD DD
DD DD DD DD
DD DD DD DD
DD DD DD DD
DD DD DD DD
DD DD DD DD
AB AB AB AB
AB AB AB AB
00 00 00 00
00 00 00 00
79 00 09 00
EE 04 EE 00
40 05 32 00
40 05 32 00
82 00 09 01
5E 04 18 00
E0 2B 32 00
78 01 32 00
EE FE EE FE
EE FE EE FE
EE FE EE FE
EE FE EE FE
EE FE EE FE
EE FE EE FE
EE FE EE FE
EE FE EE FE
EE FE EE FE
EE FE EE FE
EE FE EE FE
EE FE EE FE
EE FE EE FE
EE FE EE FE
EE FE EE FE
EE FE EE FE
EE FE EE FE
EE FE EE FE

Colors:

  • Green: win32 bookkeeping info
  • Blue: CRT block filled with dead memory
  • Gray: memory given back to win32 heap

The two tables above are put in a single, more detailed, table below:

Address (hex) Offset HeapAlloc malloc Free before HeapFree Free after HeapFree Description
00320FD8 -40 01090009 01090009 01090009 01090082 Win32 Heap info
00320FDC -36 001807E8 001807E8 0018075E 0018045E Win32 Heap info
00320FE0 -32 BAADF00D 00320798 DDDDDDDD 00322BE0 pBlockHeaderNext
00320FE4 -28 BAADF00D 00000000 DDDDDDDD 00320178 pBlockHeaderPrev
00320FE8 -24 BAADF00D 00000000 DDDDDDDD FEEEEEEE szFileName
00320FEC -20 BAADF00D 00000000 DDDDDDDD FEEEEEEE nLine
00320FF0 -16 BAADF00D 0000000C DDDDDDDD FEEEEEEE nDataSize
00320FF4 -12 BAADF00D 00000001 DDDDDDDD FEEEEEEE nBlockUse
00320FF8 -8 BAADF00D 0000002E DDDDDDDD FEEEEEEE lRequest
00320FFC -4 BAADF00D FDFDFDFD DDDDDDDD FEEEEEEE gap (no mans land)
00321000 0 BAADF00D CDCDCDCD DDDDDDDD FEEEEEEE Data requested
00321004 +4 BAADF00D CDCDCDCD DDDDDDDD FEEEEEEE Data requested
00321008 +8 BAADF00D CDCDCDCD DDDDDDDD FEEEEEEE Data requested
0032100C +12 BAADF00D FDFDFDFD DDDDDDDD FEEEEEEE No mans land
00321010 +16 ABABABAB ABABABAB ABABABAB FEEEEEEE Win32 Heap info
00321014 +20 ABABABAB ABABABAB ABABABAB FEEEEEEE Win32 Heap info
00321018 +24 00000000 00000000 00000000 FEEEEEEE Win32 Heap info
0032101C +28 00000000 00000000 00000000 FEEEEEEE Win32 Heap info
00321020 +32 00090079 00090079 00090079 FEEEEEEE Win32 Heap info
00321024 +36 00EE04EE 00EE04EE 00EE04EE FEEEEEEE Win32 Heap info
00321028 +40 00320540 00320540 00320540 FEEEEEEE Win32 Heap info
0032102C +44 00320540 00320540 00320540 FEEEEEEE Win32 Heap info

About the Author
Marius Bancila is a Microsoft MVP for VC++. He works as a software developer for a major software company in the automotive field. He is mainly focused on building desktop applications with MFC. Other areas of interest are the .NET framework and WinFX - the new API for Windows Vista. He considers that CodeGuru is the best place on internet to spend time on.

Feedback

# re: (轉)Inside CRT: Debug Heap Manage  回復  更多評論   

2008-02-22 20:44 by 微塵
看了這篇文章后,多少明白些Debug下的內存分配機制,印象最深的是終于明白 內存泄漏后,有些內存值為啥老是 0xCD了, 哈哈, 汗自己!

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美一二三区精品| 久久久亚洲高清| 欧美午夜电影完整版| 亚洲精品欧美一区二区三区| 欧美激情一二区| 欧美日韩精品一区| 亚洲午夜精品一区二区| 一区二区高清| 国产亚洲一本大道中文在线| 久久亚洲精品视频| 免费成人网www| 亚洲少妇在线| 性欧美超级视频| 亚洲国产网站| 亚洲图片欧洲图片av| 国产精品视频男人的天堂| 久久久久久久久久久成人| 久久国产黑丝| 99视频日韩| 欧美一区二区啪啪| 亚洲精品看片| 亚洲一区二区欧美日韩| 亚洲第一网站免费视频| 99国产精品久久| 国产在线拍偷自揄拍精品| 亚洲第一在线| 国产欧美日韩免费看aⅴ视频| 另类天堂视频在线观看| 欧美连裤袜在线视频| 欧美影片第一页| 欧美多人爱爱视频网站| 销魂美女一区二区三区视频在线| 久久久综合网| 亚洲欧美在线高清| 欧美成人按摩| 久久人人爽国产| 欧美午夜精品理论片a级按摩| 美女尤物久久精品| 国产精品亚洲а∨天堂免在线| 欧美韩日一区二区三区| 国产女优一区| 亚洲美女av网站| 亚洲激情在线视频| 欧美主播一区二区三区| 亚洲男人第一网站| 欧美巨乳在线| 亚洲国产精品一区二区www| 国产综合视频| 午夜精品成人在线视频| 亚洲自拍啪啪| 欧美日韩伊人| 亚洲人成人77777线观看| 一区在线观看视频| 欧美一级理论性理论a| 亚洲免费中文字幕| 欧美日韩在线视频首页| 亚洲激情电影中文字幕| 在线日韩中文| 久久久精品2019中文字幕神马| 欧美尤物巨大精品爽| 国产精品九九久久久久久久| 日韩视频免费| 在线视频你懂得一区| 欧美日本免费| 亚洲麻豆国产自偷在线| 在线视频一区观看| 欧美日韩亚洲91| 日韩小视频在线观看| 在线亚洲伦理| 国产精品视频不卡| 亚洲欧美日韩在线播放| 欧美主播一区二区三区美女 久久精品人| 欧美日韩美女一区二区| 亚洲欧洲免费视频| 日韩午夜高潮| 国产精品国产三级国产普通话三级| 亚洲免费观看在线视频| 亚洲一区二区三区视频播放| 国产精品成人一区二区三区吃奶| 一本色道久久综合狠狠躁篇的优点 | 老司机午夜精品视频在线观看| 国产精品亚洲а∨天堂免在线| 午夜精品久久久久久99热软件| 久久国产精品久久久久久| 国产精品综合| 久久夜色精品国产亚洲aⅴ| 欧美电影在线观看| 亚洲视频网站在线观看| 国产毛片一区| 免费日韩视频| 一区二区久久| 久久亚洲二区| 一区二区高清视频在线观看| 国产精品久久国产精品99gif| 亚洲欧美亚洲| 欧美国产日韩一区二区| 亚洲一区网站| 黑人一区二区| 欧美日韩亚洲综合在线| 欧美一区二区三区婷婷月色 | 久久久久久一区二区三区| 亚洲欧洲精品一区二区三区 | 国产综合网站| 欧美另类女人| 久久精品在线播放| 亚洲精品偷拍| 久久人人97超碰人人澡爱香蕉| 亚洲精品视频免费观看| 国产欧美一区二区精品婷婷| 欧美va亚洲va日韩∨a综合色| 一区二区三区成人| 欧美高清视频免费观看| 亚洲欧美综合v| 99re66热这里只有精品4| 国产伦精品一区二区三区在线观看| 久久免费精品日本久久中文字幕| 亚洲麻豆国产自偷在线| 欧美成人黑人xx视频免费观看| 亚洲一级二级在线| 亚洲欧洲视频| 在线免费高清一区二区三区| 国产精品青草久久久久福利99| 嫩模写真一区二区三区三州| 久久成人18免费观看| 一区二区三区欧美激情| 亚洲人成在线观看| 免费观看亚洲视频大全| 久久久久高清| 西西裸体人体做爰大胆久久久| 洋洋av久久久久久久一区| 亚洲国产va精品久久久不卡综合| 国产欧美日韩亚洲一区二区三区| 欧美三级网址| 欧美劲爆第一页| 欧美国产日韩一区| 欧美va亚洲va香蕉在线| 久久综合九色综合欧美狠狠| 欧美在线视频一区二区| 午夜精品久久久久久久久久久| 在线一区二区视频| 一本色道久久综合| 一区二区日韩精品| 一区二区国产日产| 夜夜嗨av一区二区三区四区| 99精品欧美一区| 99香蕉国产精品偷在线观看| 99成人精品| 亚洲一级二级| 亚洲欧美另类在线| 欧美在线观看你懂的| 久久精品久久99精品久久| 久久久99国产精品免费| 美国十次了思思久久精品导航| 久久婷婷国产综合尤物精品| 久久久亚洲国产美女国产盗摄| 久久久久网址| 欧美精品日韩| 国产精品视频99| 国产亚洲欧洲一区高清在线观看 | 欧美性天天影院| 国产精品三区www17con| 国产日韩视频| 亚洲高清一区二| 一区二区三区免费观看| 亚洲嫩草精品久久| 久久久综合激的五月天| 欧美黄色一级视频| 日韩午夜精品| 香蕉久久a毛片| 欧美成人免费一级人片100| 欧美视频日韩视频| 国产一区二区三区无遮挡| 亚洲欧洲一区二区天堂久久| 亚洲四色影视在线观看| 久久久久免费| 亚洲人精品午夜在线观看| 亚洲一区二区三区四区中文| 久久久久久一区二区| 欧美日韩精品三区| 国内揄拍国内精品久久| 亚洲免费观看在线观看| 欧美一级午夜免费电影| 欧美激情视频免费观看| 亚洲欧美国产高清va在线播| 久久综合网hezyo| 国产精品呻吟| 日韩亚洲欧美精品| 老巨人导航500精品| 一区二区免费在线播放| 美女网站在线免费欧美精品| 国产精品免费aⅴ片在线观看| 亚洲国产网站| 久久久久高清| 亚洲自拍三区| 欧美日韩精品免费观看视一区二区 | 久久久www成人免费精品| 国产精品福利在线| 亚洲卡通欧美制服中文| 久久久精品免费视频| 一本色道久久综合亚洲精品不卡|