最近在学习 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 |
|