最近在学习 Win32编程,所以顺便将每日所学记录下来,一方面为了巩固学习的知识,另一方面也为同样在学习Win32开发的童鞋们提供一份参考。
本系列博文均根据学习《Windows核心编程》一书总结而来;
运行环境:
- 操作系统: Windows 10家庭版
 - 编译器:Visual Studio 2019
 
堆栈
线程用来分配许多较小的数据块。
进程的默认堆栈
线程的默认堆栈大小是1MB,但是系统可以扩大进程的默认堆栈。当创建程序的时候,可以使用/HEAP链接开关;
可以调用GetProcessHeap函数获取进程默认堆栈的句柄;
1  | 
  | 

创建辅助堆栈
在进程中创建辅助堆栈,放是调用HeapCreate函数:
1  | HANDLE HeapCreate(DWORD flOptions, //flOptions用于修改如何在堆栈上执行各种操作。你可以设定 0、HEAP_NO_SERIALIZE、 HEAP_GENERATE_EXCEPTIONS或者是这两个标志的组合。  | 
HeapAlloc必须执行以下操作:
- 遍历分配的和释放的内存块的链表
 - 寻找一个空闲内存块的地址
 - 通过将空闲内存块标记为”已分配”分配新内存块
 - 将新内存块添加给内存块链表
 
堆分配内存
若要从堆中分配内存块,只需要调用HeapAlloc函数
1  | LPVOID HeapAlloc(HANDLE hHeap, //堆申请句柄  | 
改变内存大小
当我们所有的数据存入内存的时候,再缩小内存块的大小
1  | LPVOID HeapReAlloc(HANDLE hHeap,  | 
获取内存的大小
1  | DWORD HeapSize( HANDLE hHeap,  | 
释放堆内存
当不在需要内存块时,可以调用HeapFree函数来释放:
1  | BOOL HeapFree(HANDLE hHeap, //释放的句柄  | 
释放堆栈
1  | BOOL HeapDestroy(HANDLE hHeap ); //堆栈句柄  | 
demo:
1  | 
  |