[内存管理(1)] 分配和释放堆内存[TZZ]
1、打开VS2017,新建一个命名为“MemoryMgtDemo1”的“Windows控制台应用程序”项目;
2、在打开的“MemoryMgtDemo1.cpp”文件中,包含Windows.h头文竭惮蚕斗件,然后添加“获取当前进程默鹚剖蛲蛋认堆句柄”的测试代码。代码编写完毕后,调试运行程序。在弹出的控制台窗口中,可以见到“获取应用程序默认堆成功”的字样,表示GetProcessHeap函数调用成功。每个进程都有一个默认的堆内存(对应的是物理内存,并非虚拟内存中的堆内存),对于32位程序而言,其最大大小只能到4GB,超过4GB的内存将无法寻址(一维数组地址的最大值只能到unsigned long(-1));
![[内存管理(1)] 分配和释放堆内存[TZZ]](https://exp-picture.cdn.bcebos.com/874f6275e5f4fcf5acf7ad7b21d7726b0de2bd53.jpg)
3、结束控制台程序,返回到main函数中。继欹爸葛端续添加“从默认堆上分配一块内存”的测试程序,然后调试运行程序,在弹出的控制台窗口中,可以见到分配内存成功的输出信息。在这份测试代码中,通过HeapA造婷用痃lloc函数从默认堆内存上分配了一块128字节的内存,然后判断该函数是否调用成功。HeapAlloc函数的第2个参数,可以设定堆内存的访问方式(默认是同步访问,加HEAP_NO_SERIALIZE则为非同步)、是否将分配的内存清0(HEAP_ZERO_MEMORY)以及是否在内存不够是抛系统异常(HEAP_GENERATE_EXCEPTIONS);
![[内存管理(1)] 分配和释放堆内存[TZZ]](https://exp-picture.cdn.bcebos.com/e4b5e2f5ee0d3aceee2de5de87e265e7350fbb53.jpg)
4、结束控制台程序,返回到main函数中。继续添加“获取buffer1字节大小”的测试程序,然后调试运行。在弹出的控制台窗口中,可以见到获取到的buffer1大小与分配的大小一致。在调用HeapSize时,必须保证第1个参数为堆内存句柄,第3个参数为从堆内存上分配的内存块指针;
![[内存管理(1)] 分配和释放堆内存[TZZ]](https://exp-picture.cdn.bcebos.com/ef4c24ceaad7726b4a18f252bf0f64781523b953.jpg)
5、结束控制台程序,返回到main函数中。继续添加“输出buffer1中所有字节”的测试代码。这份代码中,采用for循环遍历buffer1中的所有字节内存,每输出8个字节则额外输出一个回车,切换到下一行中继续输出。代码编写完毕后,调试运行程序。在弹出的控制台窗口中,可以见到打印出的buffer1的内容,其中存放的值均为内存中的残留数据;
![[内存管理(1)] 分配和释放堆内存[TZZ]](https://exp-picture.cdn.bcebos.com/ab966c6b0ce265e77cf5f3cd9f23beb9773eb753.jpg)
6、结束控制台程序,返回到“MemoryMgtDemo1.cpp”文件中。在main函数之上,新增一个“tx_print_heap_memory”函数,专门用于以每行8个字节输出内存中的数据内容(多增加一个参数,则可以指定每行显示的字节数);
![[内存管理(1)] 分配和释放堆内存[TZZ]](https://exp-picture.cdn.bcebos.com/a68c126efbf202b3d12d0ece30f4da5873dadb53.jpg)
![[内存管理(1)] 分配和释放堆内存[TZZ]](https://exp-picture.cdn.bcebos.com/fab31cb375d7997b1d0e4dedf9dade49600fd953.jpg)
![[内存管理(1)] 分配和释放堆内存[TZZ]](https://exp-picture.cdn.bcebos.com/7496877bbbf4da58da2049fcea0f8b56ac04d753.jpg)
![[内存管理(1)] 分配和释放堆内存[TZZ]](https://exp-picture.cdn.bcebos.com/bab5c45872dade49cbf51ce326042e6816e9d553.jpg)
![[内存管理(1)] 分配和释放堆内存[TZZ]](https://exp-picture.cdn.bcebos.com/739bc049610f8b5601feb9dd9ce951e10ff8d353.jpg)
11、至此,在堆上分配和释放内存的测试代码就介绍完毕了。如果您希望学到更多实用的编程知识,记得关注我哦!Enjoy!