-
-
[分享]堆
-
发表于: 2021-4-26 00:45 2900
-
堆常识
堆是操作系统给你几个分页(具体几个分页看LINK选项,link选项也有堆保留,堆提交),操作系统给你一个初始堆。
堆保留大小:指定虚拟内存中堆分配的合计大小 默认1mb
堆提交大小:指定物理内存中堆分配的合计大小 默认4kb
栈保留大小:指定虚拟内存中栈分配的合计大小 默认1mb
栈提交大小:指定物理内存中栈分配的合计大小 默认4kb
1mb = 1024kb
1kb = 1024byte
16进制 1k( 4096字节) 等于一个分页 。
所以堆空间肯定是0x1000的倍数。
堆空间申请从哪来
在main函数前的堆初始化来的。
winapi:HeapCreate()//创建堆环境,给你几个分页
这是在Main 前 初始化堆的代码(VC++6.0 )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | int __cdecl _heap_init ( int mtflag ) { / / Initialize the "big-block" heap first. if ( (_crtheap = HeapCreate( mtflag ? 0 : HEAP_NO_SERIALIZE, BYTES_PER_PAGE, 0 )) = = NULL ) return 0 ; / / Pick a heap, any heap __active_heap = __heap_select(); if ( __active_heap = = __V6_HEAP ) { / / Initialize the small - block heap if (__sbh_heap_init(MAX_ALLOC_DATA_SIZE) = = 0 ) { HeapDestroy(_crtheap); return 0 ; } } else if ( __active_heap = = __V5_HEAP ) { if ( __old_sbh_new_region() = = NULL ) { HeapDestroy( _crtheap ); return 0 ; } } return 1 ; } |
//1.首先初始化“大块” 堆
//2.挑选堆
//3.初始化小块堆
调式版中堆初始化CDCDCD,
发布版不做初始化动作。
堆有问题常有的4个子,在内存中:
0xCDCD 屯:堆未初始化
0xFEEE 铪:表示空闲 (某些系统)
0xDDDD 葺:表示空闲 (某些系统)
0xDE 掭
0xCCCC 烫:栈未初始化
堆保存信息
在申请堆后,获得堆的地址。堆地址的前0x20字节保存了堆的信息。
堆栈保存信息 ,类似双向链表。
想看堆的调式信息,要调用非标准api: _malloc_dbg()
#ifdef _DEBUG
char psz = (char )_malloc_dbg(10,_NORMAL_BLOCK,FILE,LINE);
#endif
如果 有_ _FILE__ 一定要加 #ifdef _DEBUG #endif
malloc //heapAlloc
free //HeapFree
堆创建的过程:
1.HeapCreate 建酒店
2.HeapAlloc 租酒店
3.HeapFree 退租
4.HeapDestroy 拆酒店
为了安全高版本堆分配随机化。